Spring-Security练习

来源:互联网 发布:自动谱曲软件下载 编辑:程序博客网 时间:2024/06/02 03:20

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

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 思想体现: 事务管理和权限管理.

原创粉丝点击