Я пробовал настраиваемую Spring Security с AccessDecisionVoter
. В классе я сравниваю домен с ролью пользователя. Если пользователь имеет значение «ROLE_ADMIN» или «ROLE_XYZ», это не имеет значения, потому что я всегда получаю «ROLE_USER» для grantedAuthority.getAuthority()
назад.
В UserInfoEndpoint
я возвращаю объект Principal
. Ответ включает в себя правильные права доступа.
Конфигурация безопасности
@Configuration
@EnableWebSecurity
@EnableOAuth2Client
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Bean
AuthenticationSuccessHandler authenticationSuccessHandler() {
return new AuthententicationSuccessHandler();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/img/**").permitAll()
.anyRequest().authenticated()
.accessDecisionManager(accessDecisionManager())
.and()
.oauth2Login()
.successHandler(authenticationSuccessHandler())
.and()
.exceptionHandling().accessDeniedPage("/403")
.and()
.csrf().disable();
http
.headers()
.frameOptions().sameOrigin();
}
@Bean
public AccessDecisionManager accessDecisionManager() {
List<AccessDecisionVoter<? extends Object>> decisionVoters = Arrays.asList(new WebExpressionVoter(), new RoleVoter(), new AuthenticatedVoter(), new DomainBasedVoter());
return new UnanimousBased(decisionVoters);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
DomainBasedVoter
public class DomainBasedVoter implements AccessDecisionVoter {
@Override
public boolean supports(ConfigAttribute attribute) {
return true;
}
@Override
public boolean supports(Class clazz) {
return true;
}
@Override
public int vote(Authentication authentication, Object object, Collection collection) {
FilterInvocation filterInvocation = (FilterInvocation) object;
HttpServletRequest request = filterInvocation.getHttpRequest();
String subdomain = request.getServerName().replace(".domain.com", "");
String role = "ROLE_" + subdomain;
System.out.println(authentication.getName());
for (GrantedAuthority grantedAuthority : authentication.getAuthorities()) {
if (grantedAuthority.getAuthority().equals(role)) {
System.out.println("Authority " + grantedAuthority.getAuthority() + " equals " + role + " - Access Granted");
return ACCESS_GRANTED;
}
System.out.println("Authority " + grantedAuthority.getAuthority() + " not equals " + role);
}
System.out.println("Access denied");
if (subdomain.equals("localhost"))
return ACCESS_GRANTED;
return ACCESS_DENIED;
}