Spring oauth2Client grantAuthority.getAuthority () всегда возвращает ROLE_USER - PullRequest
0 голосов
/ 21 февраля 2020

Я пробовал настраиваемую 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;
    }

...