ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/9/24 21:07:41 拓冰建站 浏览量
系列六、Spring Security中的认证  授权  角色继承

一、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 {@Resourceprivate MyAuthenticationSuccessHandler7003 successHandler;@Resourceprivate MyAuthenticationFailureHandler7003 failureHandler;@Resourceprivate MyLogoutSuccessHandler7003 logoutSuccessHandler;@Resourceprivate MyAuthenticationEntryPoint7003 authenticationEntryPoint;@Resourceprivate MyAccessDeniedHandler7003 accessDeniedHandler;/*** 密码加密器* @return*/@BeanPasswordEncoder passwordEncoder() {return NoOpPasswordEncoder.getInstance();}/*** 根据UserDetailsService定义基于内存的用户* @return*/@Beanprotected 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*/@Beanprotected RoleHierarchy roleHierarchy() {RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();roleHierarchy.setHierarchy("ROLE_admin > ROLE_dba");return roleHierarchy;}@Overrideprotected 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角色)