2016-03-26 7 views
0

Ich muss rollenbasierten Zugriff für meine REST-APIs bereitstellen, und ich habe gesehen, dass wir hierfür @PreAuthorize, @Secured verwenden können. Jedoch bin ich mir nicht sicher, welche Änderungen ich machen sollte, und bekomme dies an Ort und Stelle, da ich derzeit ein custom token based authentication mechanism erzeuge ein Token für eine Sitzung und handle es selbst.So integrieren Sie Spring Security für rollenbasierte URL-/Methodenzugriffe

Die Result-Klasse enthält nur ein generiertes Token für den Benutzer, das er bei jeder Anfrage weitergibt.

nun eine Idee, welche Änderungen soll ich den Zugriff auf eine API beschränken machen, wenn der Benutzer in bestimmten Rolle ist

Zum Beispiel, wenn ich durch Benutzer des API findById auf den zugegriffen werden soll eingeschränkt werden soll nur, wenn er Teil ist von ADMIN_ROLE dann muss ich die PreAuthorize Annotation hinzufügen, bin mir aber nicht sicher, wie dies die Benutzerrolle bestimmen und den Benutzer automatisch blockieren wird.

@PreAuthorize("ADMIN_ROLE") 
@RequestMapping(value = "{id}", method = RequestMethod.GET) 
public @ResponseBody Group findById(@PathVariable int id) { 
    return groupParser.getGroupById(id, groupService.getGroupTree()); 
} 
+0

Ich behandle eine benutzerdefinierte Token basierende Authentifizierung @RequestMapping (value = "login", method = RequestMethod.POST) public @ResponseBody Ergebnis Login (@RequestBody Credentials Berechtigungsnachweise) { return loginService.login (credentials.getUsername (), credentials.getPassword()); } –

+0

bitte, anstatt die Konfiguration zu erklären, posten Sie es :-) Sie werden viel genauere Antwort haben, wenn Sie es tun. –

+0

Danke @StefanoCazzola. Ich habe einige Änderungen vorgenommen und weitere Informationen hinzugefügt. –

Antwort

1

Was Sie tun müssen, ist Spring Safety-Konfiguration zu optimieren. Unten ein Beispiel mit XML-Konfiguration (ich bin viel mehr daran gewöhnt); es ist jedoch auch in JavaConfig machbar.

Grundsätzlich ist Frühling Sicherheit durch die

<http ....> 
... 
</http> 

Element

gebrannt. Sie müssen es so schreiben (oder etwas Ähnliches)

<beans:bean id="authenticatedVoter" class="org.springframework.security.web.access.expression.WebExpressionVoter"> 
     <beans:property name="expressionHandler" ref="..." /> 
</beans:bean> 

<beans:bean id="roleVoter" 
     class="org.springframework.security.access.vote.RoleVoter"> 
     <beans:property name="rolePrefix" value="" /> <!-- if you want to customize role prefix --> 
</beans:bean> 

<beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"> 
     <beans:constructor-arg> 
       <beans:list> 
         <beans:ref bean="roleVoter" /> 
         <beans:ref bean="authenticatedVoter" /> 
       </beans:list> 
     </beans:constructor-arg> 
</beans:bean> 

<!-- use-expressions enables the @PreAuthorize --> 
<http use-expressions="true" access-decision-manager-ref="accessDecisionManager"> 
.... 
</http> 

Beachten Sie die Bohnen hinzugefügt: Sie sind drei Spring-Komponenten.

Die erste enthält eine nicht spezifizierte Referenz. Er erwartet, dass SecurityExpressionHandler etwas Umsetzung: in Ihrem Fall Sie dann DefaultMethodSecurityExpressionHandler

bieten müssen werde, Ihre benutzerdefinierte Token Konfiguration hinzuzufügen, werden Sie einen Filter der eigenen und Draht in das HTTP Element schreiben müssen. Sie können durch die Erweiterung Spring classes es ganz einfach tun und Anpassen dann sein Verhalten

public class MyClientAuthenticationFilter extends OncePerRequestFilter { 
    .... 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { 
     // custom logics here 
     // throw exception for not authenticated 
    } 
} 

und dann

<bean class="x.y.z.MyClientAuthenticationFilter" id="myClientAuthenticationFilter" /> 
<http ....> 
    <custom-filter ref="myClientAuthenticationFilter" before="BASIC_AUTH_FILTER" /> 
</http> 

Sie sollten grundsätzlich erfolgen verdrahten.

Denken Sie daran, spring-security-aspects in Ihrem Build: Spring Sicherheit @PreAuthorize und andere Anmerkungen werden über AOP abgefangen, daher müssen Sie diese Aspekte in Ihrem Klassenpfad bereitstellen.

Denken Sie auch daran, dass dies nicht die vollständige Konfiguration ist: Es würde ein sehr lange Post, um alles zu verdrahten: Es ist nur ein Beispiel darüber, wie zu starten.

Weitere Informationen finden Sie in der Spring Security-Dokumentation.

Letzte Anmerkung: Wenn Sie JvaConfig anstelle von XML verwenden, sollte es Anmerkungen geben, die Sie von einem Teil dieser Konfiguration befreien können, aber vom benutzerdefinierten Filter.

Ich hoffe, es hilft.

+0

Danke Stefano für den Hinweis. Ich habe die Java-Config-Umgebung genau auf der Grundlage Ihrer XML-Konfiguration eingerichtet und die Spring-Sicherheitsfunktionen für meine Anwendung integriert. Eine weitere Sache, die ich getan habe, ist, dass ich einen Filter in meiner Anwendung hinzugefügt habe, der eine Authentifizierung im SecurityContextHolder.getContext hinzufügt, während ich tokenbasierte Authentifizierung verwendete und für den nächsten Aufruf der Status verloren geht und ich den Zustand neu erstellen muss, damit @PreAuthorize funktioniert fein. –