2012-05-23 4 views
3

Я использую весну MVC и весеннюю безопасность.Spring Security + MVC аннотации Недопустимый аргумент аргумента

У меня есть контроллер, управляемый аннотациями, и пытаюсь добавить к нему аннотации безопасности. Код

Контроллера:

@Controller 
public class SomeController implements MessageSourceAware { 

    @Secured("ROLE_ADMIN") 
    @RequestMapping(value = "/somepage", method = RequestMethod.GET) 
    public String getPage(HttpServletRequest request, ModelMap model) { 
     // logic 
     return ADMIN_VIEW_NAME; 
    }

Мои spring-security.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:security="http://www.springframework.org/schema/security" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
     http://www.springframework.org/schema/security 
     http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

    <security:global-method-security secured-annotations="enabled" /> 

    <security:http auto-config="true" use-expressions="true" access-denied-page="/denied"> 

     <security:intercept-url pattern="/login" access="permitAll"/> 
     <!--<security:intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')"/>--> 

     <security:form-login 
       login-page="/login" 
       authentication-failure-url="/login?error=true" 
       default-target-url="/index"/> 

     <security:logout 
       invalidate-session="true" 
       logout-success-url="/login" 
       logout-url="/logout"/> 

    </security:http> 

    <!-- Declare an authentication-manager to use a custom userDetailsService --> 
    <security:authentication-manager> 
     <security:authentication-provider user-service-ref="authManager"> 
      <security:password-encoder ref="passwordEncoder"/> 
     </security:authentication-provider> 
    </security:authentication-manager> 

    <!-- Use a SHA encoder since the user's passwords are stored as SHA in the database --> 
    <bean class="org.springframework.security.authentication.encoding.ShaPasswordEncoder" id="passwordEncoder"/> 

    <!-- A custom service where Spring will retrieve users and their corresponding access levels --> 
    <bean id="authManager" class="some.package.AdminManager"/> 

</beans>

Когда я попробовать открыть защищенную страницу я получаю следующее сообщение об ошибке:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: object is not an instance of declaring class 
HandlerMethod details: 
Controller [$Proxy139] 
Method [public java.lang.String SomeController.getPage(javax.servlet.http.HttpServletRequest,org.springframework.ui.ModelMap)] 
Resolved arguments: 
[0] [type=org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper] [value=SecurityContextHolderAwareRequestWrapper[ FirewalledRequest[ [email protected]]]] 
[1] [type=org.springframework.validation.support.BindingAwareModelMap] [value={}]

Если я удалить обеспеченную аннотацию и раскомментируйте следующий строка в spring-security.xml:

<security:intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')"/>

Все работает нормально.

Благодарим за помощь.

ответ

11

Move

<security:global-method-security secured-annotations="enabled" /> 

из пружинного security.xml в файл XML, на который ссылается главный диспетчерский сервлет, как правило, что-то вроде сервлет-context.xml или приложения-context.xml

Смотрите здесь http://static.springsource.org/spring-security/site/faq/faq.html#faq-method-security-in-web-context

Кроме того, я думаю, что нужно добавить «прокси-целевой класс =„истинный“» к аннотацию глобального метода-безопасности, а также как

<security:global-method-security secured-annotations="enabled" proxy-target-class="true"/> 
+1

Спасибо. 'proxy-target-class' необходим. Я добавил cglib и asm, и он работает. –

Смежные вопросы