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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich lief in das gleiche problem und mir ist auch aufgefallen das der code ausgeführt wurde, der
checkUserScopes
- Methode zweimal. Ich fand heraus, dass das, was fehlt, ist, dass sowohl der Nutzer als auch der CLIENT müssen die Behörden, die Sie zurückgeben möchten.So definieren Sie Ihre Kunden in einer Weise, wie diese (passen Sie die Rollen, um Ihre eigenen):
Nun der client hat die erforderlichen Behörden, user und admin.
Und konfigurieren Sie Ihre Wunsch-Fabrik: