Spring Security SecurityConfig 配置说明

  1. 基于角色或权限进行访问控制
    1. hasAuthority
    2. hasAnyAuthority
    3. hasRole
    4. hasAnyRole
  2. 注解使用
    1. @Secured
    2. @PreAuthorize
    3. @PostAuthorize
    4. @PreFilter
    5. @PostFilter
    6. 权限表达式
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    // 注入 PasswordEncoder 类到 spring 容器中
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // 放行登录页面以及静态资源
            .authorizeRequests()
            .antMatchers("/layui/**","/index") //表示配置请求路径
            .permitAll() // 指定 URL 无需保护。
            .anyRequest() // 其他请求
            .authenticated(); //需要认证
    }
}

基于角色或权限进行访问控制

hasAuthority

如果当前的主体具有指定的权限,则返回 true,否则返回 false

可以在两个地方设置权限策略

配置类中 http.antMatchers("/findAll").hasAuthority("admin")

控制器中 @PreAuthorize("hasAuthority('admin')")

可以在 UserDetailsService.loadUserByUsername 中添加权限

return new User(username, user.getPassword(), 
                AuthorityUtils.commaSeparatedStringToAuthorityList("admin,role,ROLE_ADMIN"));

注意上面小写的才是授权(Authority)

hasAnyAuthority

如果当前的主体有任何提供的角色(给定的作为一个逗号分隔的字符串列表)的话,返回
true

hasRole

如果用户具备给定角色就允许访问,否则出现 403

如果当前主体具有指定的角色,则返回 true

可以在 UserDetailsService.loadUserByUsername 中添加角色

return new User(username, user.getPassword(), 
                AuthorityUtils.commaSeparatedStringToAuthorityList("admin,role,ROLE_ADMIN"));

注意上面ROLE_开头的才是角色(Role)

hasAnyRole

表示用户具备任何一个条件都可以访问

注解使用

@Secured

判断是否具有角色,另外需要注意的是这里匹配的字符串需要添加前缀 ROLE_

使用注解前先要在启动类中开启注解功能!

@EnableGlobalMethodSecurity(securedEnabled=true)

在控制器方法上添加注解

@RequestMapping("getUser")
@ResponseBody
@Secured({"ROLE_normal","ROLE_admin"})
public String getUser() {
    return "hello,user";
}

@PreAuthorize

进入方法前的权限验证

Spring Security 默认关闭了这些注解,使用注解前先要在启动类中开启注解功能!

@EnableGlobalMethodSecurity(prePostEnabled=true)

@PreAuthorize 可以将登录用户的 roles/permissions 参数传到方法中

使用方法如下

@RequestMapping("/preAuthorize")
@ResponseBody
@PreAuthorize("hasAnyAuthority('menu:system')")
public String preAuthorize(){ return null; }

@PostAuthorize

这个注解使用并不多,在方法执行后再进行权限验证,适合验证带有返回值
的权限

Spring Security 默认关闭了这些注解,使用注解前先要在启动类中开启注解功能!

@EnableGlobalMethodSecurity(prePostEnabled=true)

使用方法如下

@RequestMapping("/testPostAuthorize")
@ResponseBody
@PostAuthorize("hasAnyAuthority('menu:system')")
public String preAuthorize(){ return null; }

@PreFilter

进入控制器之前对数据进行过滤。按设定的规则过滤数据列表,将符合规则的留下,将不符合规则的剔除

Spring Security 默认关闭了这些注解,使用注解前先要在启动类中开启注解功能!

@EnableGlobalMethodSecurity(prePostEnabled=true)

使用方法如下,我这里过滤出 id 是偶数的数据

@RequestMapping("getTestPreFilter")
@PreAuthorize("hasRole('ROLE_管理员')")
@PreFilter(value = "filterObject.id%2==0")
@ResponseBody
public List<UserInfo> getTestPreFilter(@RequestBody List<UserInfo> list){
    list.forEach(t-> {
        System.out.println(t.getId()+"\t"+t.getUsername());
    });
    return list;
}

@PostFilter

控制器 return 之后对数据进行过滤。按设定的规则过滤数据列表,将符合规则的留下,将不符合规则的剔除

@PostFilter 虽然简单易用,但如果某方法中返回的数据量过大,则由于其需要遍历其每一项的特点,将对程序的执行效率产生影响。

权限表达式

https://docs.spring.io/spring-security/site/docs/5.3.4.RELEASE/reference/html5/#el-access


转载请注明来源。 欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。 可以在下面评论区评论,也可以邮件至 sharlot2050@foxmail.com。

文章标题:Spring Security SecurityConfig 配置说明

字数:858

本文作者:夏来风

发布时间:2021-06-06, 23:00:00

原始链接:http://www.demo1024.com/blog/spring-security-config/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。