2016-06-22 16 views
1

Ich hoffe, dass mir jemand bei der Integration der @ PreAuthorize Annotation mit verwalteten Beans helfen kann. Ich habe versucht, dies für die letzten Stunden zu arbeiten, aber anscheinend fehlt mir etwas. Meine Recherchen im Internet haben gezeigt, dass das Global-Method-Security-Element mit spring oder mit aspectj verwendet werden kann. Da ich meine verwalteten Bohnen nicht als Frühlingsbohnen deklarieren möchte, habe ich mich für aspectj entschieden. Aus irgendeinem Grund wird die Annotation PreAuthorize jedoch vollständig ignoriert. Ich erhalte keine Fehler und alles wird kompiliert und läuft gut, aber es gibt keine Sicherheitsprüfung für die verwaltete Bean. Anscheinend benötigt aspectj eine Art Weben ??? Vielleicht gehe ich auf diese falsche Art und Weise und es gibt einen einfacheren Weg ... nicht sicher. Verwenden von Tomcat 7 mit JSF 2.2 und Spring Security 4. Ich habe die Anmerkung zur Klasse, aber das könnte mein Problem sein. Ich gehe davon aus, dass das Setzen der Klasse auf die Klasse ihre Standard-Konstruktormethode verwendet.Spring Security 4 JSF Managed Bean vorautorisieren Annotation

Kann jemand bitte beraten? (Configs unten)

security.xml

<b:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:b="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> 

<http use-expressions="true"> 
    <headers> 
     <frame-options policy="SAMEORIGIN" /> 
    </headers> 
    <intercept-url pattern="/admin/**" access="hasRole('Admin')" /> 
    <intercept-url pattern="/cms/**" access="hasAnyRole('Admin','CMS_Admin')" /> 
    <form-login login-page='/login' default-target-url="/" /> 
    <logout invalidate-session="true" logout-success-url="/" /> 
    <csrf disabled="true"/> 
</http> 

<b:bean name="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> 
<b:bean name="iberisUserDetailsService" class="com.bizznetworxonline.iberis.core.web.controllers.admin.security.IberisUserDetailsService"/> 

<authentication-manager> 
    <authentication-provider user-service-ref='iberisUserDetailsService'> 
     <password-encoder ref="bcryptEncoder"/> 
    </authentication-provider> 
</authentication-manager> 

<global-method-security mode="aspectj" pre-post-annotations="enabled" proxy-target-class="true"> 
</global-method-security> 

</b:beans> 

Maven bauen

<plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.8</version> 
      <configuration> 
       <showWeaveInfo>true</showWeaveInfo> 
       <aspectLibraries> 
        <aspectLibrary> 
         <groupId>org.springframework.security</groupId> 
         <artifactId>spring-security-aspects</artifactId> 
        </aspectLibrary> 
       </aspectLibraries> 
      </configuration> 
      <executions> 
       <execution> 
        <goals> 
         <goal>compile</goal> 
        </goals> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>org.aspectj</groupId> 
        <artifactId>aspectjrt</artifactId> 
        <version>${aspectj.version}</version> 
       </dependency> 
       <dependency> 
        <groupId>org.aspectj</groupId> 
        <artifactId>aspectjtools</artifactId> 
        <version>${aspectj.version}</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

Bean Managed

@ManagedBean 
@ViewScoped 
@PreAuthorize("hasAnyRole('Admin')") 
public class ProductManagement 

Antwort

2

Wie Sie JSF anweisen Bean zu erstellen und nicht Frühling, @PreAuthorize macht da wenig Sinn. Auch wenn der Frühling mit der Bohne zu erstellen, ist seine Verwendung auf Methoden gezielt (auch wenn Sie eine Klasse mit Anmerkungen versehen können alle ihre Methoden zu haben, verarbeitet):

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

Hier Frühling überprüft, ob die aktuellen protokollierten Benutzer die Benutzerrolle haben , damit er einen Kontakt herstellen kann.

Es scheint, dass Sie in Ihrer Frage den Zugriff auf eine ganze Ansicht einschränken möchten. Warum also nicht wie in Ihrer security.xml-Deklaration vorgehen?

<intercept-url pattern="/products/product_management.xhtml" access="hasRole('USER')" /> 

Auf diese Weise prüft Spring Security die Berechtigung in seinem Webfilter, was noch besser ist. auch

Siehe:

+0

Ich hatte gehofft, würde es den Konstruktoraufruf blockieren, wenn auch in der Klasse deklariert. Ich habe es auf einer bestimmten Methode versucht und es funktioniert immer noch nicht. Es ist okay, obwohl ich denke, dass ich das falsch mache, wie du gesagt hast. Ich werde bei der abcept-URL bleiben und dann meine eigene kleine Sicherheits-Util-Klasse erstellen, um bestimmte Methoden zu überprüfen. Ich denke, das wird mir mehr Kontrolle geben. Auf diese Weise kann ich Berechtigungen in meine Datenbank basierend auf Rollen setzen. Je weniger Kämpfe mit der Sicherheit im Frühling, desto besser. – user2677597

+0

@ user2677597 Ich habe meine Antwort etwas geändert, um das Problem besser zu erklären. Wie ich bereits sagte, gibt es keine Möglichkeit Springkommentare in einer JSF-Bean zu verwenden. Sie könnten es immer noch in eine Spring Bean verwandeln (siehe die Spring-Dokumentation, den Teil der Integration mit anderen Frameworks). Wenn Sie so vorgehen, müssen Sie Ihren benutzerdefinierten Bereich implementieren, um den JSF-Ansichtsbereich zu emulieren, aber Sie haben bereits einige Implementierungen im Internet ausgeführt. –

+0

@ user2677597 Haben Sie es gelöst? Was haben Sie getan, um die Annotationsebene für die Methode der verwalteten Beans zu erhalten? –