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

 更新时间:2024年11月16日 09:26:28   作者:龙茶清欢  
文章介绍了三种使用Spring Boot Security的方法:基于配置文件、基于配置类和基于注解的方式,通过这些方法,可以实现对Web应用的权限控制,确保只有授权用户才能访问特定资源

基于配置文件使用security

首先引入两个必备的依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

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

spring:
  application:
    name: spring-security
  security:
    user:
      name: user
      roles: admin
      password: 123456
server:
  port: 8848

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

@RestController
@RequestMapping("/test")
public class TestConteoller {

    @GetMapping("/security")
    public String security(){
        return "test-spring-security登陆成功";
    }
}

启动应用并访问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()
                // permitAll()    对所有请求放行
                .mvcMatchers("/admin/security").hasRole("admin")
                .mvcMatchers("/user/security").hasRole("user")
                .mvcMatchers("/tUser/selectAll").anonymous()
                // anonymous()    允许匿名访问,登陆状态不能访问

                .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");

    }
}

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登陆成功";
    }
}

重新启动应用,并分别访问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 {

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

特别说明:

hasRole和hasAuthority基本上没有区别,主要差异在于hasRole会在我们添加的角色名称前添加ROLE_前缀,所以在数据库中的权限字符串需要加上 ROLE_ 前缀。

即数据库中存储的用户角色如果是 ROLE_admin,这里就是 admin。hasAuthority和数据库一样就行

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 你一定不知道的Java Unsafe用法详解

    你一定不知道的Java Unsafe用法详解

    Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,下面这篇文章主要给大家介绍了关于Java Unsafe用法的相关资料,需要的朋友可以参考下
    2021-10-10
  • java ArrayList集合中的某个对象属性进行排序的实现代码

    java ArrayList集合中的某个对象属性进行排序的实现代码

    这篇文章主要介绍了java ArrayList集合中的某个对象属性进行排序的实现代码,需要的朋友可以参考下
    2016-07-07
  • Java面试题-实现复杂链表的复制代码分享

    Java面试题-实现复杂链表的复制代码分享

    这篇文章主要介绍了Java面试题-实现复杂链表的复制代码分享,小编觉得还是挺不错的,具有参考价值,需要的朋友可以了解下。
    2017-10-10
  • Java多线程的其他知识_动力节点Java学院整理

    Java多线程的其他知识_动力节点Java学院整理

    这篇文章主要介绍了Java多线程的其他知识,需要的朋友可以参考下
    2017-05-05
  • mybatis查询语句揭秘之封装数据

    mybatis查询语句揭秘之封装数据

    这篇文章主要给大家介绍了关于mybatis查询语句揭秘之封装数据的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mybatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • Java中Pattern.compile函数的使用详解

    Java中Pattern.compile函数的使用详解

    这篇文章主要介绍了Java中Pattern.compile函数的使用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 详解SpringBoot上传图片到阿里云的OSS对象存储中

    详解SpringBoot上传图片到阿里云的OSS对象存储中

    这篇文章主要介绍了SpringBoot上传图片到阿里云的OSS对象存储中,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • redis与ssm整合方法(mybatis二级缓存)

    redis与ssm整合方法(mybatis二级缓存)

    本文给大家介绍redis与ssm整合方法(mybatis二级缓存)。主要是利用redis去做mybatis的二级缓存,mybaits映射文件中所有的select都会刷新已有缓存,如果不存在就会新建缓存,所有的insert,update操作都会更新缓存
    2017-12-12
  • C/C++和Java的交互详解

    C/C++和Java的交互详解

    本文旨在简单的介绍一下如何让java层和C/C++层相互调用,这里主要是使用了JNI技术,并没有深究其原理,只是做了个实现,其目的是为后面的学习打开一扇窗。
    2016-01-01
  • Nacos集群模式下服务无法注册问题

    Nacos集群模式下服务无法注册问题

    这篇文章主要介绍了Nacos集群模式下服务无法注册问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01

最新评论