2014-03-13 8 views
5

Ich kann nicht verstehen, warum meine Sicherheit nicht richtig funktioniert. Methode hasPermission() in der Evaluator-Klasse nicht einmal aufgerufen. Ich denke, dass etwas mit meiner Sicherheitskonfiguration nicht stimmt.Warum funktioniert meine benutzerdefinierte PermissionEvaluator nicht?

My Security config:

<?xml version="1.0" encoding="UTF-8"?> 
<bean:beans xmlns:bean="http://www.springframework.org/schema/beans" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:sec="http://www.springframework.org/schema/security" 
      xmlns="http://www.springframework.org/schema/security" 
      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"> 

    <sec:http use-expressions="true"> 
     <sec:intercept-url pattern="/favicon.ico" access="permitAll"/> 
     <sec:intercept-url pattern="/resources/**" access="permitAll"/> 
     <sec:intercept-url pattern="/login" access="permitAll"/> 
     <sec:form-login login-page="/login" 
         username-parameter="login" 
         password-parameter="password" 
         authentication-failure-url="/login?error" 
         authentication-success-handler-ref="successHandler"/> 
     <sec:logout logout-url="/logout" logout-success-url="/login?logout"/> 
     <sec:access-denied-handler error-page="/WEB-INF/views/error/403.jsp"/> 
    </sec:http> 

    <sec:authentication-manager> 
     <sec:authentication-provider ref="userAuthenticationProvider"/> 
    </sec:authentication-manager> 

    <sec:global-method-security pre-post-annotations="enabled" secured-annotations="enabled"> 
     <sec:expression-handler ref="expressionHandler"/> 
    </sec:global-method-security> 

    <bean:bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
     <bean:property name="permissionEvaluator" ref="permissionEvaluator"/> 
    </bean:bean> 

    <bean:bean id="permissionEvaluator" class="de.mark.project.security.UserPermissionEvaluator"> 
     <bean:constructor-arg ref="userSecurityService"/> 
    </bean:bean> 

    <bean:bean id="successHandler" class="de.mark.project.security.UrlAuthenticationSuccessHandler"/> 
    <bean:bean id="userSecurityService" class="de.mark.project.service.UserService"/> 

    <bean:bean name="userAuthenticationProvider" class="de.mark.project.security.UserAuthenticationProvider"> 
     <bean:constructor-arg ref="userSecurityService"/> 
    </bean:bean> 

</bean:beans> 

Hier meine benutzerdefinierte Evaluator ist:

public class UserPermissionEvaluator implements PermissionEvaluator { 
    private UserService service; 

    @Autowired 
    public UserPermissionEvaluator(UserService service) { 
     this.service = service; 
    } 

    @Override 
    public boolean hasPermission(Authentication authentication, 
           Serializable targetId, String targetType, 
           Object permission) { 

     UserDetails principal = (UserDetails) authentication.getPrincipal(); 
     User authorizedUser = service.getUser(principal.getUsername()); 
     Collection<Permission> userPermissions = authorizedUser.getPermissions(); 

     for (Permission p : userPermissions) { 
      if (p.getName().equals(allowedPermission)) { 
       return true; 
      } 
     } 
     return false; 
    } 

    @Override 
    public boolean hasPermission(Authentication authentication, 
           Serializable targetId, String targetType, 
           Object permission) { 
     throw new RuntimeException("Error"); 
    } 
} 

Methode in der Steuerung, die Sicherheit mit:

@RequestMapping(method = RequestMethod.GET) 
@PreAuthorize("hasPermission(null, 'create_user')") 
public String createUserForm(@ModelAttribute("user") User user) { 
    return "user/internal/form/credentialForm"; 
} 

Irgendwelche Ideen, wie es zu beheben?

UPD:

<web-app 
     version="2.4" 
     xmlns="http://java.sun.com/xml/ns/j2ee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
     http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd"> 


    <!-- log4j configuration --> 
    <context-param> 
     <param-name>log4jConfigLocation</param-name> 
     <param-value>classpath:/log4j.properties</param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
    </listener> 


    <!-- Config Setup --> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      classpath:/spring-config/security.xml 
      classpath:/spring-config/data.xml 
     </param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 


    <!-- Spring MVC --> 
    <servlet> 
     <servlet-name>mvc</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>classpath:/spring-config/mvc.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>mvc</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 


    <!-- Error handling --> 
    <error-page> 
     <error-code>404</error-code> 
     <location>/WEB-INF/views/error/404.jsp</location> 
    </error-page> 
</web-app> 

UPD 2

Spring MVC config:

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

    <mvc:annotation-driven/> 
    <ctx:component-scan base-package="de.mark.project.web"/> 
    <sec:global-method-security pre-post-annotations="enabled"/> 
    <mvc:resources mapping="/resources/**" location="classpath:/style/"/> 

    <mvc:interceptors> 
     <bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor"> 
      <property name="cacheSeconds" value="0"/> 
      <property name="useExpiresHeader" value="true"/> 
      <property name="useCacheControlHeader" value="true"/> 
      <property name="useCacheControlNoStore" value="true"/> 
     </bean> 
    </mvc:interceptors> 

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 
</beans> 

Antwort

3

Dies ist wahrscheinlich auf die Tatsache zurückzuführen, dass die <global-method-security> Tag im selben Kontext sein muss als Spring MVC Konfiguration sonst werden Ihre Controller nicht nachbearbeitet. Dies ist discussed in the FAQ.

So zum Beispiel, wenn Ihr web.xml sieht wie folgt aus:

<!-- 
    - Location of the XML file that defines the root application context 
    - Applied by ContextLoaderListener. 
    --> 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/spring/*.xml 
    </param-value> 
</context-param> 

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<!-- 
    - Loads the root application context of this web app at startup. 
    - The application context is then available via 
    - WebApplicationContextUtils.getWebApplicationContext(servletContext). 
--> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<servlet> 
    <servlet-name>spring</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/mvc/*.xml</param-value> 
    </init-param> 
</servlet> 

Um Methode Sicherheit auf Ihrem Controller sorgt für den <global-method-security> Tag definiert ist in einer Position innerhalb/WEB-INF/Mvc/* Unterstützung .xml. Beachten Sie, dass der Rest der Konfiguration dort bleiben sollte, wo er ist. Wenn Sie die Methodensicherheit für Ihre Dienste unterstützen möchten, benötigen Sie wahrscheinlich auch <global-method-security> im übergeordneten Verzeichnis (d. H. Wo es jetzt wahrscheinlich ist).

Wenn dies nicht hilft, schreiben Sie Ihre web.xml oder WebApplicationInitializer ist, wenn Sie nicht web.xml verwenden

+0

Ich habe web.xml – user3279337

+0

noch kein Glück :( – user3279337

+0

Bitte beachten Sie auch Post aktualisiert/spring-config/mvc.xml (stelle sicher, dass darin '' enthalten ist) –

Verwandte Themen