Spring Security——基于角色或权限访问控制

基于角色或权限访问控制

  1. hasAuthority方法
    如果当前主体具有指定的权限,则返回true,否则返回false
    1. 在配置类设置当前访问地址有哪些权限
    //当前登录用户,只要具有admin权限才可以访问这个路径
    .antMatchers("/test/index").hasAuthority("admin")
    
    1. 在UserDetailsService,把返回User对象设置权限
    List<GrantedAuthority> role = AuthorityUtils.commaSeparatedStringToAuthorityList("admin");
    
    1. type=Forbidden,status=403表示没有访问权限
  2. hasAnyAuthority方法
    如果当前主体有任何一个提供的角色的话,返回true
.antMatchers("/test/index").hasAnyAuthority("admin,manager")

List<GrantedAuthority> role = AuthorityUtils.commaSeparatedStringToAuthorityList("admin");
  1. hasRole方法
  • 赋予角色的时候需加上前缀"ROLE_"
.antMatchers("/test/index").hasRole("sale")
List<GrantedAuthority> role = AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_sale");
private static String hasRole(String role) {
    Assert.notNull(role, "role cannot be null");
    Assert.isTrue(!role.startsWith("ROLE_"), () -> {
        return "role should not start with 'ROLE_' since it is automatically inserted. Got '" + role + "'";
    });
    return "hasRole('ROLE_" + role + "')";
}
  1. hasAnyRole方法
    用户具备任何一个都可以访问

自定义403页面

http.exceptionHandling().accessDeniedPage("/unauth.html");

认证授权注解使用

  1. @Secured注解,用户具有某个角色,可以访问方法
    1. 启动类(配置类)开启注解
    @EnableGlobalMethodSecurity(securedEnabled = true)
    
    1. 在Controller的方法上面使用注解,设置角色
    @GetMapping("/secured")
     @Secured({"ROLE_sale","ROLE_manager"})
     public String secured(){
         return "hello secured";
     }
    
    1. userDetailsService设置用户角色
    List<GrantedAuthority> role = AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_sale");
    
  2. @PreAuthorize:在方法执行之前检验
    1. 开启注解
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    
    1. 在controller的方法上面使用注解
     @GetMapping("/preAuthorize")
     @PreAuthorize("hasAnyAuthority('admin,manager')")
     public String preAuthorize(){
         return "hello PreAuthorize";
     }
    
  3. @PostAuthorize:在方法执行之后校验
  4. @PostFilter:对方法返回的数据进行过滤
@GetMapping("/testFilter")
@PreAuthorize("hasAnyAuthority('admin,manager')")
@PostFilter("filterObject.username == 'admin11'")
public List<User> testFilter(){
    ArrayList<User> list = new ArrayList<>();
    list.add(new User(11,"admin11","111"));
    list.add(new User(22,"admin22","222"));
    System.out.println(list);
    return list;
}

控制台输出

[User(id=11, username=admin11, password=111), User(id=22, username=admin22, password=222)]

前端输出

[
    {
        id: 11,
        username: "admin11",
        password: "111"
    }
]
  1. @PreFilter:进入控制器之前对数据进行过滤

用户注销

  1. 在配置类添加退出的配置
http.logout().logoutUrl("/logout")
                .logoutSuccessUrl("/test/hello").permitAll();
  1. 测试
    1. 修改配置类,登录成功后跳转到成功页面
    2. 在成功页面添加超链接,写退出路径
    3. 登录成功之后,在成功页面点击退出,再去访问其他controller不能进行访问

自动登录

  1. 实现原理

在这里插入图片描述

在这里插入图片描述

  1. 具体实现
    1. 创建数据库表
    2. 修改配置类,注入数据源
    //注入数据源
     @Autowired
     private DataSource dataSource;
     //配置对象
     @Bean
     public PersistentTokenRepository persistentTokenRepository(){
         JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
         jdbcTokenRepository.setDataSource(dataSource);
         jdbcTokenRepository.setCreateTableOnStartup(true);
         return jdbcTokenRepository;
     }
    
    1. 配置类中配置自动登录
    .rememberMe().tokenRepository(persistentTokenRepository())
                 .tokenValiditySeconds(60)
    
    1. 登录页面添加复选框
     <input type="checkbox" name="remember-me">自动登录
    
    1. 数据库中存储的信息
      请添加图片描述

CSRF:跨站请求伪造

  1. 原理
    在这里插入图片描述

  2. 默认开启

  3. 针对PATCH、POST、PUT、DELETE

<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
  1. GET、HEAD、TRACE、OPTIONS不做保护
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
对于基于 RBAC(Role-Based Access Control)的权限控制,可以使用 Spring Boot 和 Spring Security实现。下面是一个简单的步骤指南: 1. 添加依赖:在你的 Spring Boot 项目的 pom.xml 文件中,添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` 2. 创建用户和角色实体:创建用户(User)和角色(Role)的实体类,可以使用 JPA 或者其他持久化框架来进行数据库操作。 3. 实现 UserDetailsService:创建一个实现Spring Security 的 UserDetailsService 接口的类,用于加载用户信息。这个类需要重写 loadUserByUsername 方法,根据用户名从数据库中查询用户信息并返回一个 UserDetails 对象。 4. 创建权限访问控制配置类:创建一个配置类,继承自 WebSecurityConfigurerAdapter,并重写 configure 方法。在这个方法中,你可以配置哪些 URL 需要哪些角色权限才能访问。 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasAnyRole("ADMIN", "USER") .anyRequest().authenticated() .and().formLogin().permitAll() .and().logout().permitAll(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder()); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override @Bean public UserDetailsService userDetailsService() { // 返回自定义的 UserDetailsService 实现类 // 在这个实现类中通过 JPA 或其他方式查询用户信息 return new CustomUserDetailsService(); } } ``` 5. 配置密码加密:在上面的配置类中,我们使用了 BCryptPasswordEncoder 作为密码加密方式。确保你的用户表中保存的密码是经过 BCrypt 加密的。 6. 创建登录页面:创建一个登录页面,可以是一个简单的 HTML 页面或者使用模板引擎进行渲染。 7. 配置登录页面:在 application.properties 或 application.yml 文件中,配置登录页面的路径和其他相关属性。 ```properties spring.security.login-page=/login spring.security.logout-success-url=/login?logout ``` 以上步骤完成后,你的 Spring Boot 应用程序就可以基于 RBAC 实现简单的权限控制了。根据实际需求,你可以进一步扩展和定制 Spring Security 的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一大岐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值