Spring Security的使用
一、spring security是什么?
spring家族中的一款权限校验、安全框架,可以和spring无缝整合
二、为什么要是用安全框架,不使用可以吗?
安全框架实际就是对过滤器做了代理增强,简化我们的拦截校验代码,同时简化我们在对RBAC的代码操作
三、什么是权限管理,如何从数据库层面出发设计权限管理?
- 权限管理指的是,对当前用户可以进行的可执行操作的管理
- 三表模式:直接为每一位赋予对应的权限
- 用户名、用户权限表 、权限表
- 五表模式:将用户分组引入角色
- 用户表、用户角色表、角色表、角色权限表、权限表
- 根据需求可在细分七表、九表等
三、实例演示
- 导入依赖
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
</properties>
<dependencies>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!--数据库链接-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring security-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<!--web-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
-
配置web.xml文件
<!--加载配置文件的路径--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-security.xml</param-value> </context-param> <!--配置文件的加载方式--> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <!---security的过滤器的代理对象--> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <!--拦击的路径--> <filter-mapping> <!--springSecurityFilterChain是固定的名称--> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
spring security配置文件,配置拦截规则和校验规则
<!--开放的不用登陆成功就可以访问的资源--> <http pattern="资源路径" security="none"/> <!--登陆和注销的拦截业务处理 use-expression是否使用表达式写法--> <http use-expression="false"> <!--那些资源要具有那些相应的权限 intercept-url资源路径--> <intercept-url pattern="/**" access="ROLE_USER" /> <!-- always-use-default-target登录成功后是返回登录之前的资源,还是default-target-url--> <form-login login-page="/自定义的登录页面" default-target-url="/登录成功后的跳转地址" always-use-default-target="true" authentication-failure-url="/登录失败后的跳转地址"/> <!--关闭跨站点请求--> <csrf disabled="true"/> <!--注销,注销后跳转到登录页面--> <logout/> <!--如果页面使用了frameset或者iframe则需要添加下面的配置--> <headers> <frame-options policy="SAMEORIGIN"/> </headers> </http> <!-- 配置文件形式的认证管理器 --> <authentication-manager> <authentication-provider> <!--指定固定的权限--> <user-service> <!--权限要是用大写,如:ROLE_USER--> <user name="用户名" password="密码" authorities="权限"/> </user-service> </authentication-provider> </authentication-manager> <!-- 自定义用户信息认证管理器 实现 UserDetailService接口 --> <authentication-manager> <authentication-provider user-service-ref="userDetailService"> </authentication-provider> </authentication-manager> <!-- 定义自定义认证类 --> <beans:bean id="userDetailService" class="com.youlexuan.service.UserDetailsServiceImpl"></beans:bean>
-
自定义实现用户认证管理
/** * * @param s 当前登录的用户名 * @return * @throws UsernameNotFoundException */ @Override public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { //todo(根据当前登录的用户名s,查询数据库中对应用户的信息) return new User("用户名","密码",权限集合); }
-
security的加密
<authentication-provider user-service-ref='userDetailService'> <!--添加加密配置--> <password-encoder ref="bcryptEncoder"></password-encoder> </authentication-provider> <!--加密实现类--> <beans:bean id="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
//密码加密 BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); String password = passwordEncoder.encode(seller.getPassword()); seller.setPassword(password);
-
登录成功后获取当前用户的信息
String name=SecurityContextHolder.getContext().getAuthentication().getName();