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


    基于配置文件使用security

    首先引入两个必备的依赖

            
                org.springframework.boot
                spring-boot-starter-security
            
            
                org.springframework.boot
                spring-boot-starter-web
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

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

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

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

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

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

    test-spring-security登陆成功

    基于配置类使用security

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

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

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

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

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

    重新启动应用,并分别访问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) 注解开启该功能

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

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

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

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    Spring MVC - 相关内容1
    软件设计开发技术的演进
    刷题记录:牛客NC20471[ZJOI2007]棋盘制作
    (27)Blender源码分析之顶层菜单的关于对话框
    PingCode 完成近亿元人民币C轮融资,打造世界级研发管理与协作平台
    日常开发小点汇总(1)
    applyMiddleware 原理
    在linux安装单机版hadoop-3.3.6
    Redis与分布式:哨兵模式
    Xcode、终端、Mason、nvim.debug环境路径
  • 原文地址:https://blog.csdn.net/bsegebr/article/details/126114188