目标
整合 SpringSecurity 实现最简登陆鉴权及方法鉴权,大致理解 SpringSecurity 的功用。
操作步骤
添加依赖
编码
Controller 层
添加一个最简单的测试接口
启动类
可以看到,除了在 pom 文件加了一个 spring-boot-starter-security 依赖,其它跟创建最简 springBoot 应用没有区别。
最简初体验
最简体验就是什么都不做,直接体验,启动应用,查看日志,可以看到有一行比较特殊
通过网页访问 http://localhost:8080/hello 地址,原本页面应该显示 hello world 字样,但实际有所偏差,页面被自动跳转至 http://localhost:8080/login,而且出现一个很丑的登录界面,这个不重要,重要的是我们的访问被阻止了,被 SpringSecurity 要求登录。
SpringSecurity 默认提供了一个用户名称叫 user,密码就是上面提到的日志里打印出来的,从格式看应该是一个 UUID。输入用户名密码进行登录,我们终于看到了 hello world,这就是 SpringSecurity 最简初体验。
配置用户名密码
配置用户名,密码,角色,配置过后,重启应用,日志中将不会再有生成密码那一行。
添加方法权限验证
注册
在启动类上添加 @EnableGlobalMethodSecurity 注解,用于开启方法权限验证,该注解有三个参数
- securedEnabled:开启 @Secured 注解
用法:
- 单个角色:@Secured(“ROLE_USER”)
- 多个角色任意一个:@Secured({“ROLE_USER”,“ROLE_ADMIN”})
- prePostEnabled:开启 @PreAuthorize 及 @PostAuthorize 注解,分别适用于进入方法前后进行鉴权,支持表达式
用法:
- 允许所有访问:@PreAuthorize(“true”)
- 拒绝所有访问:@PreAuthorize(“false”)
- 单个角色:@PreAuthorize(“hasRole(‘ROLE_USER’)”)
- 多个角色与条件:@PreAuthorize(“hasRole(‘ROLE_USER’) AND hasRole(‘ROLE_ADMIN’)”)
- 多个角色或条件:@PreAuthorize(“hasRole(‘ROLE_USER’) OR hasRole(‘ROLE_ADMIN’)”)
- jsr250Enabled:开启 JSR-250 相关注解
用法:
- 允许所有访问:@PermitAll
- 拒绝所有访问:@DenyAll
- 多个角色任意一个:@RolesAllowed({“ROLE_USER”, “ROLE_ADMIN”})
验证
编写 Service 并为每个方法添加权限注解
执行测试用例
使用编码的方式进行配置
SpringSecurity 提供了一个 WebSecurityConfigurerAdapter 配置类,此类有三个重要的方法可供继承
- configure(AuthenticationManagerBuilder auth)配置在内存中进行注册公开内存的身份验证
- configure(WebSecurity web)配置拦截资源,例如过滤掉css/js/images等静态资源
- configure(HttpSecurity http)定义需要拦截的URL
本例,我们重写 configure(AuthenticationManagerBuilder auth) 方法,在内存中添加两个用户。
使用了编码的方式进行配置后,在配置文件中配置的用户将失效。
源码地址
本章源码 : https://github.com/caiyuanzi-song/boot.git
结束语
SpringSecurity 与 Shiro 是两个最常用的权限框架,SpringSecurity 因为是 Spring 全家桶中的一员,所以在与 Spring 的集成方面会更好一点。