我正试图通过使用ant匹配器来保护我的web应用程序的部分,并且还配置了分层角色。下面是我的安全配置:
角色层次结构:
private SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy());
return defaultWebSecurityExpressionHandler;
}
@Bean
public RoleHierarchyImpl roleHierarchy(){
RoleHierarchyImpl hierarchy = new RoleHierarchyImpl();
hierarchy.setHierarchy("SUPER_ADMIN > ADMIN ADMIN > PATIENT");
return hierarchy;
}
用户,角色:
@Autowired
public void configureAuthentication(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("rakesh").password("rakesh").roles("PATIENT");
auth.inMemoryAuthentication().withUser("root").password("root").roles("ADMIN");
auth.inMemoryAuthentication().withUser("notroot").password("notroot").roles("SUPER_ADMIN");
}
请求授权:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.loginPage("/web/login")
.loginProcessingUrl("/web/login")
.usernameParameter("username").passwordParameter("password")
.defaultSuccessUrl("/web/patient/home")
.and()
.authorizeRequests()
.expressionHandler(webExpressionHandler())
.antMatchers("/web/patient/add*").access("hasRole('ADMIN')")
.antMatchers("/web/patient/home").access("hasRole('PATIENT')") // home URL
.antMatchers("/allpatients").access("hasRole('ADMIN')")
.antMatchers("/web/**").permitAll()
.and()
.httpBasic()
.realmName(env.getRequiredProperty("basicauthentication.realm"))
.authenticationEntryPoint(getBasicAuthEntryPoint())
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.exceptionHandling()
.accessDeniedPage("/web/accessdenied")
.and()
.csrf().disable();
}
通过上述设置,没有一个用户能够登录,他们被返回到登录页面。如果我注释掉authorizeRequest中的home URL
行,它就可以工作了。不确定我做错了什么?
为loginPage和loginProcessingUrl使用相同的url对我来说很奇怪。我建议您更改其中一个,也许像这样:
.formLogin()
.loginPage("/web/login")
.loginProcessingUrl("/web/performLogin")