一、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角色)