一.根据不同的用户所访问的页面不同(普通用户和管理员)及登陆验证。
1.所用技术:Mybatis(H2数据库)+Spring+Springmvc+Spring-Security.
2.Spring-Security所需jar包:
3.mvc结构:
4.具体实现:
(1)web.xml的SpringSecurity过滤器的配置:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(2)创建WebSecurityConfig类继承WebSecurityConfigurerAdapter类:加上注解:
@Configuration //beans
@EnableWebSecurity //开启web security支持:应用bean容器里的WebSecurityConfigurer
(3)重写WebSecurityConfig类的userDetailsService方法:固定绑定角色,(可优化)
@Override
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withUsername("user")
.password("123456")
.roles("USER").build());
manager.createUser(User.withUsername("admin")
.password("123789")
.roles("ADMIN").build());
return manager;
}
(4) 重写WebSecurityConfig类的configure方法(请求分区,过滤器请求权限的拦截):它自带登陆页面,如果用自己自定义的登陆页面,则加上.loginPage(“/login”),下面会由自定义的登陆页面展示。
当非管理员登陆请求(“/admin/**’)会出现没有权限错误:
(5) 优化(3),从数据库拿用户数据,并登陆验证:数据库存的密码为密文,当登陆时输入密码(123456为例),Spring-Security自动转为密文,与数据库密文相比较(两者不同,但变成明文时都为123456)
创建User类继承org.springframework.security.core.userdetails.User,它自带的User类,
创建UserDetailsServiceImpl类继承UserDetailsService类重写它的loadUserByUsername方法,返回上面User类型参数,会自动校验,根据从登陆时,传过来的username参数
WebSecurityConfig类中开启密码加密,创建Bean
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
这个具体实现校验我也不知道,没看源码,只知道这样用。。。
二 .进入主页后的退出实现(封装好了的,不要做修改):相对应的登陆页面会由提示信息,具体如何自定义的登陆页面
三.Aop方法上的权限拦截:
当role(角色)由多个时:当请求只有同时是ADMIN和HR时才能访问,但请求分区(过滤器请求权限的拦截)只限定admin用户和普通用户(一大点中的第四小点图中的画红线部分),不能区分ADMIN用户和同时具有ADMIN和HR两种身份的用户(细分),我们可以在调用的service层的接口方法上,加上注解,限制管理员用户中(ADMIN)的HR用户的才能调用。
(1)
(2) 必须在WebSecurityConfig类中配置@EnableGlobalMethodSecurity(securedEnabled = true),用来识别限制方法上的(@Secured)注解。
四.很多网站的登陆都有记住账号密码这个功能:
(1)在WebSecurityConfig这个类中configure方法写上:
五:根据角色页面显示不同:
Spring-Security由自带的标签库需要引入包:只有HR登陆首页才会显示链接
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>//引入
<sec:authorize access="hasRole('HR')">
<a href="${pageContext.request.contextPath}/admin/employees">员工表</a>
</sec:authorize>
六:当登陆成功时,会将用户信息显示在导航栏(例如:欢迎某某登陆)
七:login页面,官方文档中有,错误信息,退出登陆提示,都有:
官网的如下:
总结:
权限管理:
(1) 从请求地址上拦截,通过web.xml过滤器的配置,再到继承了WebSecurityConfigurerAdapter的WebSecurityConfig类的重写方法中配置:
(2) aop 方法上的拦截,在service层的具体方法上加上配置。
(3) spring aop 思想体现: 事务管理和权限管理.