Spring-Security练习

一.根据不同的用户所访问的页面不同(普通用户和管理员)及登陆验证。

1.所用技术:Mybatis(H2数据库)+Spring+Springmvc+Spring-Security.

2.Spring-Security所需jar包:
这里写图片描述

3.mvc结构:
Spring-Security练习_第1张图片

4.具体实现:
(1)web.xml的SpringSecurity过滤器的配置:

<filter>
    <filter-name>springSecurityFilterChainfilter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxyfilter-class>
  filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChainfilter-name>
        /*
    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”),下面会由自定义的登陆页面展示。
Spring-Security练习_第2张图片
当非管理员登陆请求(“/admin/**’)会出现没有权限错误:
Spring-Security练习_第3张图片

(5) 优化(3),从数据库拿用户数据,并登陆验证:数据库存的密码为密文,当登陆时输入密码(123456为例),Spring-Security自动转为密文,与数据库密文相比较(两者不同,但变成明文时都为123456)
Spring-Security练习_第4张图片

创建User类继承org.springframework.security.core.userdetails.User,它自带的User类,
Spring-Security练习_第5张图片

创建UserDetailsServiceImpl类继承UserDetailsService类重写它的loadUserByUsername方法,返回上面User类型参数,会自动校验,根据从登陆时,传过来的username参数
Spring-Security练习_第6张图片

WebSecurityConfig类中开启密码加密,创建Bean

@Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

这个具体实现校验我也不知道,没看源码,只知道这样用。。。

二 .进入主页后的退出实现(封装好了的,不要做修改):相对应的登陆页面会由提示信息,具体如何自定义的登陆页面
Spring-Security练习_第7张图片

三.Aop方法上的权限拦截:
当role(角色)由多个时:当请求只有同时是ADMIN和HR时才能访问,但请求分区(过滤器请求权限的拦截)只限定admin用户和普通用户(一大点中的第四小点图中的画红线部分),不能区分ADMIN用户和同时具有ADMIN和HR两种身份的用户(细分),我们可以在调用的service层的接口方法上,加上注解,限制管理员用户中(ADMIN)的HR用户的才能调用。

(1) Spring-Security练习_第8张图片

(2) 必须在WebSecurityConfig类中配置@EnableGlobalMethodSecurity(securedEnabled = true),用来识别限制方法上的(@Secured)注解。

四.很多网站的登陆都有记住账号密码这个功能:
(1)在WebSecurityConfig这个类中configure方法写上:
Spring-Security练习_第9张图片

五:根据角色页面显示不同:
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>

六:当登陆成功时,会将用户信息显示在导航栏(例如:欢迎某某登陆)
Spring-Security练习_第10张图片

七:login页面,官方文档中有,错误信息,退出登陆提示,都有:
Spring-Security练习_第11张图片

官网的如下:
Spring-Security练习_第12张图片

总结:
权限管理:
(1) 从请求地址上拦截,通过web.xml过滤器的配置,再到继承了WebSecurityConfigurerAdapter的WebSecurityConfig类的重写方法中配置:
Spring-Security练习_第13张图片
(2) aop 方法上的拦截,在service层的具体方法上加上配置。
Spring-Security练习_第14张图片
(3) spring aop 思想体现: 事务管理和权限管理.

你可能感兴趣的:(spring-security)