2017-07-24 13 views
11

zacząłem używane zabezpieczenia sprężyny, a po wielu badań nie jestem w stanie znaleźć odpowiedź na:Wiosna kontroli bezpieczeństwa, jeżeli użytkownik ma dostęp do wymienionej url

Gdybym wyraźnie chcą sprawdzić, czy użytkownik A mają Dostęp do rzeczy B. mogę to sprawdzić z JSP tag wsparcia Spring Security - check if web url is secure/protected jak

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

ale co jeśli chcę sprawdzić to samo w sterowniku (klasy java). Nie jestem znalezieniem jakiejkolwiek funkcji sprężyny tutaj, aby sprawdzić, czy logowania użytkownika ma dostęp do wspomnianego adresu URL (https://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html)

Odpowiedz

14

Podpowiedź z javadoc:

do użycia tej tag musi być również instancją WebInvocationPrivilegeEvaluator w twój kontekst aplikacji. Jeśli korzystasz z przestrzeni nazw, zostanie ona automatycznie zarejestrowana. To jest instancją DefaultWebInvocationPrivilegeEvaluator

A w javadoc z DefaultWebInvocationPrivilegeEvaluator, widzimy isAllowed metody, które należy wykonać zadanie:

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

Dlaczego nie użyć adnotacji tak:

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

Adnotacje to standardowy sposób na wiosnę 3+

0

Jesteś patrząc w odpowiednie miejsce, dołączony link wspomina o tym, czego potrzebujesz. Ponieważ chcesz mieć kontrolę dostępu na swoim kontrolerze i sprawdzić na użytkownika (nie rolę), możesz użyć adnotacji "@PreAuthorize" z wyrażeniem "hasPermission" lub podobnym.

Można sprawdzić here dla kontroli dostępu opartej na wyrażeniach oraz here dla przykładów niestandardowego przykładu wyrażenia zabezpieczeń na wypadek, gdyby użytkownik chciał dostosować rozwiązanie.

0

1) Najpierw musimy wiedzieć, czy użytkownik może w ogóle wpisać adres URL. Można to bardzo łatwo osiągnąć za pomocą WebInvocationPrivilegeEvaluator.

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

2) Teraz musimy identyfikacji, czy użytkownik może uzyskać dostęp do metody uchwytu

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

Możemy utworzyć niestandardową PermissionEvaluator i używać

hasPermission (Uwierzytelnianie, obiekt domainObject, Uprawnienia obiektu).

@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 jest realizacja MutableAclService

0

Najbardziej oczywiście użyteczne adnotacja jest @PreAuthorize, która zdecyduje, czy metoda może być rzeczywiście wywołana lub nie.Na przykład (z „Kontakty” przykładowej aplikacji)

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

co oznacza, że ​​dostęp będzie dozwolony tylko dla użytkowników z „ROLE_USER” Rola . Oczywiście to samo można łatwo osiągnąć przy użyciu tradycyjnej konfiguracji i prostego atrybutu konfiguracji dla wymaganej roli. Ale co:

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

Tutaj jesteśmy rzeczywiście stosując metodę argumentu jako część wyrażenia zdecydować, czy bieżący użytkownik ma uprawnienia „admin” dla danego kontaktu. Wbudowane wyrażenie o nazwie hasPermission() jest połączone z modułem ACL Spring Security w kontekście aplikacji.

Aby uzyskać bardziej szczegółowe objaśnienia, zapoznaj się z tym Link

Powiązane problemy