重点记忆:
一.项目配置 1.1 数据库1.spring Security的权限配置是在user类的getAuthorities方法中实现的
2.权限注解@EnableGlobalMethodSecurity(prePostEnabled=true)
/开启权限注解 //prePostEnabled = true 属性表示开启 Spring Security 中的 @PreAuthorize、@PostAuthorize、@PreFilter 以及 @PostFilter 四个注解
权限表:用户和管理员权限
用户表
角色表:管理员和用户
用户和角色中间表
角色和权限中间表
权限表
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 extends GrantedAuthority> 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 extends GrantedAuthority> 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的所有接口
第一步 把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用户具有管理员的所有权限
可以进行管理员查询
但是依旧没有办法做用户查询
四.



