Zuordnung von Benutzer-Rollen zu oauth2 Bereiche/Behörden

Haben wir eine Berechtigungen-Datenbank, die application-id, Rollen und Benutzer Rollen zugeordnet, die pro Anwendung. Nach der Beratung auf dem thread wie kann ich die Karte Benutzer-Rollen zu oauth2 Bereiche/Behörden auf der Grundlage der resourceId?

Ignorieren die Ansprüche Datenbank, die ich oben erwähnt muss ich Karte Rollen "NUTZER", "LESER", "AUTOR", um oauth2 Bereiche/Behörden basierend auf Benutzer und resourceId im code unten?

Benutzer-Authentifizierung/Autorisierung Config

@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
    }
}

OAuth2 Config

@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()");
    }
}

Update 1:

Eingeführt einen benutzerdefinierten OAuth2RequestFactory in der config einstellen checkUserScopes zu wahren. Während dieses setup funktioniert für "client_credentails", schlägt es für "code" gewährt. Für "code" gewährt, DefaultOAuth2RequestFactory versucht maps-Behörden für client (acme), anstatt den Benutzer während der Autorisierung Schritt.
Andere Gedanke ist die Umsetzung ClientDetailsService hinzufügen, dass die Behörden der client (acme) auf der Grundlage der angemeldeten Benutzer (admin/user), aber nicht wissen, wie zu packen angemeldeten Benutzer aus SecurityContext da ist es überschrieben mit "client" (acme) im Rahmen der Autorisierung Schritt. Irgendwelche Ideen?

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;
    }

}

aktualisiert und den zugehörigen code zu

@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
    }
}
  • Irgendwelche Hinweise, @DaveSyer?
  • Ich denke, Sie haben einen Kommentar auf eines seiner anderen Antworten in Reihenfolge für ihn zu sehen, Ihre Nachricht. Aber selbst dann, er wird wahrscheinlich nicht die Zeit nehmen, um auf Ihre Frage Antworten. Und das Ergebnis ist, dass google sucht alle diese wichtigen Worte einfach in einem Haufen von unbeantworteten Fragen. Und das Endergebnis ist, dass die Leute nicht umsetzen, Frühling, OAuth2, weil es wird nicht unterstützt durch die Feder auf Stack Overflow.
  • Der defekt ist, öffnen Sie hier: github.com/spring-projects/spring-security-oauth/issues/547
InformationsquelleAutor Stackee007 | 2015-07-10
Schreibe einen Kommentar