2017-07-24 2 views
11

Ich habe mit Feder Sicherheit begonnen, und nach viel Forschung, die ich bin nicht in der Lage für eine Antwort zu finden:Frühling Sicherheitsüberprüfung, wenn der Benutzer den Zugriff auf genannte URL hat

Wenn ich ausdrücklich überprüfen möchten, ob der Benutzer A haben Zugang zu stopfen B. kann ich überprüfen, diese mit JSP-Tag-Unterstützung Spring Security - check if web url is secure/protected wie

<sec:authorize url="stuff/B"> 

Aber was ist, wenn ich die gleiche Sache in der Steuerung (Java-Klasse) überprüfen möge. Ich bin nicht zu finden hier jede Federfunktion zu überprüfen, ob ein Login-Benutzer Zugriff auf genannte URL hat (https://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html)

Antwort

14

Hinweis vom javadoc:

diesen Tag dort zu verwenden, auch eine Instanz von WebInvocationPrivilegeEvaluator sein muss Ihr Anwendungskontext. Wenn Sie den Namespace verwenden, wird einer automatisch registriert. Dies ist ein Beispiel von DefaultWebInvocationPrivilegeEvaluator

Und im javadoc von DefaultWebInvocationPrivilegeEvaluator, können wir eine isAllowed Methode sehen, die die Arbeit tun sollten:

// privilegeEvaluator is a WebInvocationPrivilegeEvaluator "autowired" 
boolean allowed = privilegeEvaluator.isAllowed("/stuff/B", yourAuthentication); 
0

Warum nicht verwenden Anmerkungen wie folgt aus:

@PreAuthorize("hasRole('ROLE_USER')") 
public void create(Contact contact); 

Anmerkungen sind Standardverfahren für den Frühling 3+

0

Sie sind Wenn Sie den richtigen Ort suchen, wird der Link, den Sie anhängen, erwähnt, was Sie brauchen. Da Sie Zugriffssteuerung auf dem Controller möchten, und überprüfen pro Benutzer (nicht Rolle) können Sie die ‚@PreAuthorize‘ Anmerkung mit „hasPermission“ Ausdruck oder ähnliches verwenden.

Sie können here für expressionsbasierte Zugriffssteuerung und für Beispiele für benutzerdefinierte Sicherheitsausdruck Beispiel überprüfen, falls Sie die Lösung anpassen möchten.

0

1) Zunächst müssen wir wissen, ob der Benutzer überhaupt die URL eingeben kann. Dies kann sehr einfach mit WebInvocationPrivilegeEvaluator erreicht werden. Jetzt

privilegeEvaluator.isAllowed(contextPath, url, "GET", currentUser); 

2) müssen wir identifizieren, ob der Benutzer die Handler-Methode zugreifen kann

private boolean isAllowedByAnnotation(Authentication currentUser, HandlerMethod method) { 
    PreInvocationAuthorizationAdvice advice = new ExpressionBasedPreInvocationAdvice(); 
    PreInvocationAuthorizationAdviceVoter voter = new PreInvocationAuthorizationAdviceVoter(advice); 

    MethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler(); 
    PrePostInvocationAttributeFactory factory = new ExpressionBasedAnnotationAttributeFactory(expressionHandler); 
    PrePostAnnotationSecurityMetadataSource metadataSource = new PrePostAnnotationSecurityMetadataSource(factory); 

    Class<?> controller = method.getBeanType(); 
    MethodInvocation mi = MethodInvocationUtils.createFromClass(controller, method.getMethod().getName()); 
    Collection<ConfigAttribute> attributes = metadataSource.getAttributes(method.getMethod(), controller); 

    return PreInvocationAuthorizationAdviceVoter.ACCESS_GRANTED == voter.vote(currentUser, mi, attributes); 
} 
0

Wir eine benutzerdefinierte PermissionEvaluator erstellen und verwenden können

hasPermission (Authentication Authentifizierung, Object Domainobject, Objektberechtigung).

@Override 
    protected MethodSecurityExpressionHandler createExpressionHandler() { 
    final DefaultMethodSecurityExpressionHandler expressionHandler = 
     new DefaultMethodSecurityExpressionHandler(); 
    expressionHandler.setPermissionEvaluator(new AclPermissionEvaluator(aclService())); 
    return expressionHandler; 
    } 

@Bean 
    public aclServiceImpl aclService() { 
    final AclServiceImpl mutableAclService = new AclServiceImpl 
     (authorizationStrategy(), grantingStrategy()); 
    return mutableAclService; 
    } 

AclServiceImpl ist die Implementierung von MutableAclService

0

Die offensichtlich nützliche Anmerkung ist @PreAuthorize, die ein Verfahren entscheidet, ob tatsächlich oder nicht aufgerufen werden kann.Zum Beispiel (aus der „Kontakten“ Beispielanwendung)

@PreAuthorize("hasRole('USER')") 
public void create(Contact contact); 

was bedeutet, dass der Zugang nur für Benutzer mit der Rolle „ROLE_USER“ zugelassen werden. Offensichtlich könnte das Gleiche leicht mit einer traditionellen Konfiguration und einem einfachen Konfigurationsattribut für die erforderliche Rolle erreicht werden. Aber was ist:

@PreAuthorize("hasPermission(#contact, 'admin')") 
public void deletePermission(Contact contact, Sid recipient, Permission permission); 

Hier sind wir tatsächlich eine Methode Argument als Teil des Ausdrucks verwendet, um zu entscheiden, ob der aktuelle Benutzer die „admin“ Berechtigung für den angegebenen Kontakt hat. Der integrierte Ausdruck hasPermission() ist über den Anwendungskontext mit dem Spring Security ACL-Modul verknüpft.

Für eine ausführlichere Erklärung verweisen Sie bitte diese Link

Verwandte Themen