当前位置:   article > 正文

spring-boot-starter-security的简单使用

spring-boot-starter-security

基于配置文件使用security

首先引入两个必备的依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-security</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-web</artifactId>
  8. </dependency>

由于springboot对starter依赖进行了自动化的配置,即约定大于配置,也就是带有starter的依赖在整合springboot时,在我们不做任何配置时,默认使用starter约定的配置,只有当我们进行自定义配置时,springboot才会使用我们的配置

通过配置文件的方式在内存中配置一个用户

  1. spring:
  2. application:
  3. name: spring-security
  4. security:
  5. user:
  6. name: user
  7. roles: admin
  8. password: 123456
  9. server:
  10. port: 8848

由于spring-boot-starter-security默认开启登录认证,所以我们需要新建一个TestController的controller类

  1. @RestController
  2. @RequestMapping("/test")
  3. public class TestConteoller {
  4. @GetMapping("/security")
  5. public String security(){
  6. return "test-spring-security登陆成功";
  7. }
  8. }

启动应用并访问http://localhost:8848/test/security,我们会看到spring-boot-starter-security自带的登陆页面,输入我们在配置文件中配置的用户名称和密码,之后我们会在页面看到

test-spring-security登陆成功

基于配置类使用security

上面我们实现了基于配置文件的security简单配置,显然这样并不适用现实场景,下面我们见通过配置类的方式实现security的自定义配置

新建config文件夹并其中新建SecurityConfig配置类,让其继承WebSecurityConfigurerAdapter抽象类并重写两个configure方法,实现web环境下的security自定义配置,具体如下

  1. @Configuration
  2. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  3. //自定义配置URL资源的权限控制
  4. @Override
  5. protected void configure(HttpSecurity http) throws Exception {
  6. http.
  7. //对所有请求进行权限认证
  8. authorizeRequests()
  9. //自定义配置请求地址权限
  10. .mvcMatchers("/test/security").permitAll()
  11. // permitAll() 对所有请求放行
  12. .mvcMatchers("/admin/security").hasRole("admin")
  13. .mvcMatchers("/user/security").hasRole("user")
  14. .mvcMatchers("/tUser/selectAll").anonymous()
  15. // anonymous() 允许匿名访问,登陆状态不能访问
  16. .anyRequest().authenticated() //所有请求都需要进行认证
  17. .and()
  18. .formLogin()
  19. //.loginPage("login") 自定义登陆页面
  20. .permitAll() //所有用户都可以访问
  21. .and()
  22. .logout()
  23. //.logoutUrl("logout") 自定义配置退出登陆页面
  24. .permitAll();
  25. }
  26. //自定义配置认证规则
  27. @Override
  28. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  29. //spring内置了两种UserDetailManager实现,一种基于内存的InMemoryUserDetailsManager,另一种是基于数据库的JdbcUserDetailsManager
  30. auth.
  31. //使用内存中的InMemoryUserDetailsManager(内存用户管理器)
  32. inMemoryAuthentication()
  33. //不使用passwordEncoder密码加密
  34. .passwordEncoder(NoOpPasswordEncoder.getInstance())
  35. //在内存中给配置user用户
  36. .withUser("admin").password("admin").roles("admin")
  37. .and()
  38. //在内存中配置admin用户
  39. .withUser("user").password("user").roles("user");
  40. }
  41. }

security配置类搞定之后,我们新建UserController和AdminController两个接口测试类,具体如下

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @GetMapping("/security")
  5. public String security(){
  6. return "user-spring-security登陆成功";
  7. }
  8. }
  9. @RestController
  10. @RequestMapping("/admin")
  11. public class AdminController {
  12. @GetMapping("/security")
  13. public String security(){
  14. return "admin-spring-security登陆成功";
  15. }
  16. }

重新启动应用,并分别访问http://localhost/test/security、http://localhost/user/security、http://localhost/admin/security三个地址,我们会发现第一个地址不用登陆就能直接访问,第二个地址需要user角色权限,第三个地址需要admin角色权限;需要注意的是,当我们访问第二个地址并使用user角色登录之后,我们访问第三个地址会报403错误,其原因是浏览器在我们使用user登录时缓存了user的登录会话信息即session状态,所以当我们登录第三个地址时浏览器会以user的登录状态去访问admin角色下的接口,显然这是访问不到的。

基于注解的方式实现对接口中方法的权限认证

首先在SecurityConfig配置类中添加@EnableGlobalMethodSecurity(prePostEnabled = true) 注解开启该功能

  1. @Configuration
  2. @EnableGlobalMethodSecurity(prePostEnabled = true) //开启基于方法的注解权限认证,默认为false
  3. public class SecurityConfig extends WebSecurityConfigurerAdapter {

然后我们就可以在想要进行权限校验的方法上使用@PreAuthorize("hasAuthority('ROLE_user')")或者@PreAuthorize("hasRole('user')")进行相应的权限校验了。

特别说明:hasRole和hasAuthority基本上没有区别,主要差异在于hasRole会在我们添加的角色名称前添加ROLE_前缀,所以在数据库中的权限字符串需要加上 ROLE_ 前缀。即数据库中存储的用户角色如果是 ROLE_admin,这里就是 admin。hasAuthority和数据库一样就行

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/701996
推荐阅读
相关标签
  

闽ICP备14008679号