mkyong example dependencia current spring-security spring-security-oauth2

spring-security - example - spring security oauth2



Asignación de roles de usuario a los ámbitos/autoridades de Oauth2 (0)

Tenemos una base de datos de derechos que tiene identificador de aplicación, roles y usuarios asignados a roles por aplicación. Siguiendo los consejos sobre el hilo de rosca, ¿cómo correlao las funciones de los usuarios con los ámbitos / autoridades de oauth2 basados ​​en resourceId?

Ignorando la base de datos de autorizaciones que mencioné anteriormente ¿asignó las funciones "USUARIO", "LECTOR", "ESCRITOR" a los ámbitos o autoridades de oauth2 en función del usuario y la ID de recurso en el código siguiente?

Autenticación de usuario / Configuración de autorización

@Configuration @Order(-10) protected static class LoginConfig extends WebSecurityConfigurerAdapter { .... @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // auth.parentAuthenticationManager(authenticationManager); // @formatter:off auth.inMemoryAuthentication() .withUser("admin").password("admin") .roles("ADMIN", "USER", "READER", "WRITER") .and() .withUser("user").password("password") .roles("USER") .and() .withUser("audit").password("audit") .roles("USER", "ADMIN", "READER"); // @formatter:on } }

Configuración de OAuth2

@Configuration @EnableAuthorizationServer protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationManager authenticationManager; @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { // @formatter:off clients.inMemory() .withClient("acme").secret("acmesecret") .authorizedGrantTypes("authorization_code", "refresh_token", "password") .scopes("openid") .and() .withClient("trusted").secret("shuush") .authorizedGrantTypes("client_credentials") .scopes("openid"); // @formatter:on } @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.authenticationManager(authenticationManager); } @Override public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception { oauthServer.checkTokenAccess("isAuthenticated()"); } }

Actualización 1:

Introdujo una OAuth2RequestFactory personalizada en la configuración para establecer checkUserScopes en verdadero. Si bien esta configuración funciona para "client_credentails", falla para las concesiones de "código". Para las concesiones de "código", DefaultOAuth2RequestFactory intenta mapear autoridades para el cliente (acme) en lugar del usuario durante el paso de autorización. Otro pensamiento es implementar ClientDetailsService que agregue autoridades de cliente (acme) basadas en el usuario conectado (administrador / usuario) pero no esté seguro de cómo obtener el usuario conectado de SecurityContext ya que se sobrescribe con el cliente (acme) durante la autorización paso. ¿Algunas ideas?

public class ScopeMappingOAuth2RequestFactory extends DefaultOAuth2RequestFactory { private SecurityContextAccessor securityContextAccessor = new DefaultSecurityContextAccessor(); public ScopeMappingOAuth2RequestFactory(ClientDetailsService clientDetailsService) { super(clientDetailsService); super.setCheckUserScopes(true); } /** * @param securityContextAccessor the security context accessor to set */ @Override public void setSecurityContextAccessor(SecurityContextAccessor securityContextAccessor) { this.securityContextAccessor = securityContextAccessor; super.setSecurityContextAccessor(securityContextAccessor); } @Override public AuthorizationRequest createAuthorizationRequest(Map<String, String> authorizationParameters) { AuthorizationRequest request = super.createAuthorizationRequest(authorizationParameters); if (securityContextAccessor.isUser()) { request.setAuthorities(securityContextAccessor.getAuthorities()); } return request; } }

y código relacionado actualizado a

@EnableAuthorizationServer protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationManager authenticationManager; private InMemoryClientDetailsService clientDetailsService; private Map<String, ClientDetails> clientDetailsStore; public InMemoryClientDetailsService clientDetailsService() { if (clientDetailsService == null) { clientDetailsStore = new HashMap<String, ClientDetails>(); InMemoryClientDetailsService m = new InMemoryClientDetailsService() { @Override public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException { ClientDetails details = clientDetailsStore.get(clientId); if (details == null) { throw new NoSuchClientException("No client with requested id: " + clientId); } return details; } }; clientDetailsService = m; } return clientDetailsService; } @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { InMemoryClientDetailsServiceBuilder builder = new InMemoryClientDetailsServiceBuilder() { @Override protected void addClient(String clientId, ClientDetails value) { clientDetailsStore.put(clientId, value); } @Override protected ClientDetailsService performBuild() { return clientDetailsService(); } }; clients.setBuilder(builder); // @formatter:off builder .withClient("acme").secret("acmesecret") .authorizedGrantTypes("authorization_code", "refresh_token", "password") .scopes("openid", "apim.read", "apim.write") .and() .withClient("trusted").secret("shuush") .authorizedGrantTypes("client_credentials") .scopes("openid", "apim.read", "apim.write") .authorities("openid", "apim.read", "apim.write"); // @formatter:on } @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.authenticationManager(authenticationManager); endpoints.requestFactory(new ScopeMappingOAuth2RequestFactory(clientDetailsService())); }

...}

LoginConfig

Configuration @Order(-10) protected static class LoginConfig extends WebSecurityConfigurerAdapter { .... @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // auth.parentAuthenticationManager(authenticationManager); // @formatter:off auth.inMemoryAuthentication() .withUser("admin").password("admin") .roles("APIM.READ", "APIM.WRITE") .and() .withUser("user").password("password") .roles("APIM.READ") .and() .withUser("audit").password("audit") .roles("APIM.READ"); // @formatter:on } }