Spring Boot - OAuth с ролями и властями - PullRequest
0 голосов
/ 03 июля 2018

Я новичок в Spring Boot и пытаюсь настроить OAuth 2.0. Мне удалось получить доступ к API с помощью токена доступа, но я получаю 403 при попытке доступа к страницам JSP.

AuthorizationServerConfig.java

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;

@Bean
public JwtAccessTokenConverter accessTokenConverter() {
    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
    converter.setSigningKey("QWERTY");
    return converter;
}

@Bean
public TokenStore tokenStore() {
    return new JwtTokenStore(accessTokenConverter());
}

@Override
public void configure(ClientDetailsServiceConfigurer configurer) throws Exception {

    configurer.inMemory().withClient(Utils.CLIEN_ID).secret(Utils.CLIENT_SECRET).authorities("ADMIN", "AGENT")
            .authorizedGrantTypes(Utils.GRANT_TYPE_PASSWORD, Utils.AUTHORIZATION_CODE, Utils.REFRESH_TOKEN,
                    Utils.IMPLICIT)
            .scopes(Utils.SCOPE_READ, Utils.SCOPE_WRITE, Utils.TRUST)
            .accessTokenValiditySeconds(Utils.ACCESS_TOKEN_VALIDITY_SECONDS)
            .refreshTokenValiditySeconds(Utils.FREFRESH_TOKEN_VALIDITY_SECONDS);
}

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    endpoints.tokenStore(tokenStore()).authenticationManager(authenticationManager)
            .accessTokenConverter(accessTokenConverter());
}
}

WebSecurityConfig.java

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Resource(name = "userService")
private UserDetailsService userDetailsService;

@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
}

@Autowired
public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService).passwordEncoder(encoder());
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable().anonymous().disable().authorizeRequests() 
 .antMatchers("/auth/**").hasRole("ADMIN");
}

@Bean
public BCryptPasswordEncoder encoder() {
    return new BCryptPasswordEncoder();
}

@Bean
public FilterRegistrationBean corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    source.registerCorsConfiguration("/**", config);
    FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
    bean.setOrder(0);
    return bean;
}
}

UserDetailServiceImplementation.java

@Service(value = "userService")
public class UserDetailServiceImplementation implements UserDetailsService {

@Autowired
private UserRepository userRepository;

public UserDetailServiceImplementation() {
    super();
}

@Override
public UserDetails loadUserByUsername(String sLoginID) throws UsernameNotFoundException {
    // TODO Auto-generated method stub

    User user = userRepository.findByLoginID(sLoginID);

    if (user == null) {
        throw new UsernameNotFoundException(sLoginID);
    }

    return new org.springframework.security.core.userdetails.User(sLoginID, user.getsPassword(),
            getAuthorities(user.getiUserTypeID()));
}

public Collection<? extends GrantedAuthority> getAuthorities(Integer role) {
    List<GrantedAuthority> authList = getGrantedAuthorities(getRoles(role));
    return authList;
}

public List<String> getRoles(Integer role) {

    List<String> roles = new ArrayList<String>();

    if (role.intValue() == 1) {
        roles.add("ROLE_AGENT");
        roles.add("ROLE_ADMIN");
    } else if (role.intValue() == 2) {
        roles.add("ROLE_MANAGER");
    }
    return roles;
}

public static List<GrantedAuthority> getGrantedAuthorities(List<String> roles) {
    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();

    for (String role : roles) {
        authorities.add(new SimpleGrantedAuthority(role));
    }
    return authorities;
}
}

ResourceServerConfig.java

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

private static final String RESOURCE_ID = "resource_id";

@Override
public void configure(ResourceServerSecurityConfigurer resources) {
    resources.resourceId(RESOURCE_ID).stateless(false);
}

@Override
public void configure(HttpSecurity http) throws Exception {
    http.anonymous().disable().authorizeRequests()
            .antMatchers("/auth/admin/**").access("hasRole('ROLE_ADMIN')").and().exceptionHandling()
            .accessDeniedHandler(new OAuth2AccessDeniedHandler());
}

}

Когда я пытался получить доступ к oauth / token в Postman And RestTemplate, я смог получить access_token и другие параметры. Контроллерная часть моего приложения имеет RestTemplate, который извлекает данные из API, основываясь на API, когда мы перенаправляем на любую страницу, скажем, запрещено из-за функции hasRole. Нужно ли мне реализовать отдельную конфигурацию безопасности для страниц JSP?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...