栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring Security(10)权限处理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Security(10)权限处理

重点记忆:

1.spring Security的权限配置是在user类的getAuthorities方法中实现的
2.权限注解@EnableGlobalMethodSecurity(prePostEnabled=true)
/开启权限注解 //prePostEnabled = true 属性表示开启 Spring Security 中的 @PreAuthorize、@PostAuthorize、@PreFilter 以及 @PostFilter 四个注解

一.项目配置 1.1 数据库

权限表:用户和管理员权限

用户表

角色表:管理员和用户

用户和角色中间表

角色和权限中间表

权限表

1.2pom.xml


    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.7.1
         
    
    com.qfedu
    security06
    0.0.1-SNAPSHOT
    security06
    Demo project for Spring Boot
    
        17
    
    


        
            org.springframework.boot
            spring-boot-starter-security
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            2.2.2
        

        
            mysql
            mysql-connector-java
            runtime
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            org.springframework.security
            spring-security-test
            test
        
    

    
        
            
                src/main/java
                
                    **
public class User implements UserDetails {
    private Integer id;
    private String username;
    private String password;
    private Boolean enabled;
    private Set permissions;

    public Set getPermissions() {
        return permissions;
    }

    public void setPermissions(Set permissions) {
        this.permissions = permissions;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setEnabled(Boolean enabled) {
        this.enabled = enabled;
    }

    
    @Override
    public Collection getAuthorities() {
        List authorities = new ArrayList<>();
            for (String permission : permissions) {
                authorities.add(new SimpleGrantedAuthority(permission));
            }
            return authorities;
    }

    
    @Override
    public String getPassword() {
        return password;
    }

    
    @Override
    public String getUsername() {
        return username;
    }

    
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    
    @Override
    public boolean isEnabled() {
        return enabled;
    }
}

注意:

这个方法用来返回当前用户的角色或者权限信息,跟shiro不同的是,spring security分的很明白,能不能访问接口,终究是根据权限来进行判定,而角色只是业务层面的一种分类,而权限是底层获取的判断的值

   
    @Override
    public Collection getAuthorities() {
        List authorities = new ArrayList<>();
            for (String permission : permissions) {
                authorities.add(new SimpleGrantedAuthority(permission));
            }
            return authorities;
    }
2.2 SecurityConfig
package com.huang.demo.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.huang.demo.model.RespBean;
import com.huang.demo.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.access.hierarchicalroles.RoleHierarchy;
import org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl;
import org.springframework.security.authentication.*;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.web.SecurityFilterChain;

import java.io.PrintWriter;

@Configuration
public class SecurityConfig {

    
    @Bean
    RoleHierarchy roleHierarchy() {
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        roleHierarchy.setHierarchy("admin > user");
        return roleHierarchy;
    }

    
    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        //开始认证
        http.authorizeRequests()
                //具备 user 权限则可以访问 /user
    @Bean
    RoleHierarchy roleHierarchy() {
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        roleHierarchy.setHierarchy("admin > user");
        return roleHierarchy;
    }
2.3.测试

测试zhangsan用户,是admin,继承了user的所有接口

测试 用户lisi ,是user,自然只能访问user的所有接口



三. 权限注解—通过权限评估器PermissionEvaluator 3.1 更改SecurityConfig

第一步 把SecurityConfig里面的角色继承方法roleHierarchy给注释掉,
第二步骤权限访问路径注释掉
第三步加上权限注解@EnableGlobalMethodSecurity(prePostEnabled=true)

/开启权限注解
//prePostEnabled = true 属性表示开启 Spring Security 中的 @PreAuthorize、@PostAuthorize、@PreFilter 以及 @PostFilter 四个注解

即SecurityConfig写成

package com.huang.demo.config;


import com.fasterxml.jackson.databind.ObjectMapper;
import com.huang.demo.model.RespBean;
import com.huang.demo.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.access.hierarchicalroles.RoleHierarchy;
import org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl;
import org.springframework.security.authentication.*;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.web.SecurityFilterChain;

import java.io.PrintWriter;

@Configuration
//开启权限注解
//prePostEnabled = true 属性表示开启 Spring Security 中的 @PreAuthorize、@PostAuthorize、@PreFilter 以及 @PostFilter 四个注解
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig {



    
    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        //开始认证
        http.authorizeRequests()
               
                //所有的请求,类似于 shiro 中的 
    @GetMapping("/user/hello")
    //判断用户具备 user 权限才能访问
//    @PreAuthorize("hasAuthority('user')")
//    @PreAuthorize("hasPermission(#principal,'user:select')")
    @PreAuthorize("hasPermission(#principal,'user:select')")
    public String hello() {
        return "hello user";
    }





    

    @DeleteMapping("/user/delete")
    //判断用户具备 user 权限才能访问
//    @PreAuthorize("hasAuthority('user')")
//    @PreAuthorize("hasPermission(#principal,'user:select')")
    @PreAuthorize("hasPermission(#principal,'user:delete')")
    public String delete() {
        return "删除成功";
    }





    
    @GetMapping("/admin/hello")
    @PreAuthorize("hasPermission(#principal,'admin')")
    public String admin() {
        return "hello admin";
    }
}
3.5 关于 @PreAuthorize注解的第二种写法
 @PreAuthorize("hasPermission(#principal,'user:select')")

一样可以实现,过几天加测

3.6测试 3.6.1 使用测试用户-lisi-user-user:select


用户查询成功

用户查询失败,报错403说明没有该权限,即我们的权限注解起到了作用。让user用户lisi只能做他有的权限

同理,user用户lisi没办法登录管理员的接口

3.6.2 使用测试用户-admin-zhangsan-admin去测试

zhangsan用户具有管理员的所有权限

可以进行管理员查询

但是依旧没有办法做用户查询

四.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1020272.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号