系列六、Spring Security中的认证 & 授权 & 角色继承

本文详细介绍了在SpringSecurity中实现认证、授权以及角色继承的过程,通过示例展示了如何配置不同角色的访问权限和登录逻辑。
摘要由CSDN通过智能技术生成

一、Spring Security中的认证 & 授权 & 角色继承

1.1、概述

        关于Spring Security中的授权,请参考【系列一、认证 & 授权】,这里不再赘述。

1.2、资源类

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2024/1/11 20:58
 * @Description: 测试资源
 */
@RestController
public class HelloController7003 {

    /**
     * 任何人都可以访问
     * @return
     */
    @GetMapping("/helloWorld")
    public R helloWorld() {
        return R.ok().data("Hello World");
    }

    /**
     * 登录后才能访问
     * @return
     */
    @GetMapping("/sayHi")
    public R sayHi() {
        return R.ok().data("嗨!");
    }

    /**
     * 需要具有dba角色的人才能访问
     * @return
     */
    @GetMapping("/dba/helloWorld")
    public R dba() {
        return R.ok().data("dba Hello World");
    }

    /**
     * 需要具有admin角色的人才能访问
     * @return
     */
    @GetMapping("/admin/helloWorld")
    public R admin() {
        return R.ok().data("admin Hello World");
    }

}

1.3、配置类

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2024/1/11 21:50
 * @Description: Spring Security配置类
 */
@Configuration
public class MyWebSecurityConfigurerAdapter7003 extends WebSecurityConfigurerAdapter {

    @Resource
    private MyAuthenticationSuccessHandler7003 successHandler;
    @Resource
    private MyAuthenticationFailureHandler7003 failureHandler;
    @Resource
    private MyLogoutSuccessHandler7003 logoutSuccessHandler;
    @Resource
    private MyAuthenticationEntryPoint7003 authenticationEntryPoint;
    @Resource
    private MyAccessDeniedHandler7003 accessDeniedHandler;

    /**
     * 密码加密器
     * @return
     */
    @Bean
    PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

    /**
     * 根据UserDetailsService定义基于内存的用户
     * @return
     */
    @Bean
    protected UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("dba").password("123456").roles("dba").build());
        manager.createUser(User.withUsername("admin").password("123456").roles("admin").build());

        return manager;
    }

    /**
     * 角色继承
     * @return
     */
    @Bean
    protected RoleHierarchy roleHierarchy() {
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        roleHierarchy.setHierarchy("ROLE_admin > ROLE_dba");

        return roleHierarchy;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/dba/**").hasRole("dba")
                .antMatchers("/admin/**").hasRole("admin")
                .antMatchers("/helloWorld")
                .permitAll()
                .anyRequest()
                .authenticated()

                .and()

                /**
                 * 登录成功 & 登录失败回调
                 */
                .formLogin()
                .loginPage("/login")
                .successHandler(successHandler)
                .failureHandler(failureHandler)

                .and()

                /**
                 * 注销登录回调
                 */
                .logout()
                .logoutUrl("/logout")
                .logoutSuccessHandler(logoutSuccessHandler)
                .permitAll()

                .and()

                .csrf()
                .disable()

                /**
                 * 未认证 & 权限不足回调
                 */
                .exceptionHandling()
                .authenticationEntryPoint(authenticationEntryPoint)
                .accessDeniedHandler(accessDeniedHandler);
    }

}

1.4、测试

1.4.1、admin登录

(一) 登录

(二) 访问sayHi(登录就可以访问)

(三)访问/admin/helloWorld接口(需要拥有admin角色) 

(四)访问/dba/helloWorld接口(需要拥有dba角色,admin自动继承dba角色) 

1.4.2、dba登录

(一) 登录

(二) 访问sayHi(登录就可以访问)

(三)访问/admin/helloWorld接口(需要拥有admin角色,由于当前登录用户是dba,所以登录拒绝) 

(四)访问/dba/helloWorld接口(需要拥有dba角色) 

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值