如何在spring security中添加@secure注释

时间:2012-01-05 16:37:55

标签: java xml spring annotations spring-security

如何在控制器的方法中添加@Secure annoatation并使其运行? 现在,当我运行它时得到了例外:

  

org.springframework.beans.factory.BeanCreationException:在文件[C:\ workspace \ sts \ springsource \ vfabric-tc-server-developer-2.6.1.RELEASE \ spring-中定义名称为'companyController'的bean创建错误insight-instance \ wtpwebapps \ BillingEngine \ WEB-INF \ classes \ com \ sesami \ common \ management \ web \ controller \ CompanyController.class]:bean的初始化失败;嵌套异常是org.springframework.aop.framework.AopConfigException:意外的AOP异常;嵌套的例外是org.springframework.beans.factory.BeanCreationException:错误创建名称为豆“org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor#0”:无法解析参考豆“的AccessDecisionManager”而设置的bean属性“的AccessDecisionManager “;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为'accessDecisionManager'的bean   org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4723)       在org.apache.catalina.core.StandardContext $ 1.call(StandardContext.java       在java.lang.Thread.run(未知来源)   引起:org.springframework.aop.framework.AopConfigException:意外的AOP异常;嵌套的例外是org.springframework.beans.factory.BeanCreationException:错误创建名称为豆“org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor#0”:无法解析参考豆“的AccessDecisionManager”而设置的bean属性“的AccessDecisionManager “;嵌套异常是... 19更多

我有春季安全.xml

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

<global-method-security secured-annotations="enabled">
<!-- 
<protect-pointcut access="ROLE_ADMIN"
        expression="execution(* com.sesami.common.management.web.controller.AdminController.*(..))" />
         -->
</global-method-security>

<!-- URL pattern based security -->
<http auto-config="false" entry-point-ref="authenticationEntryPoint"
    use-expressions="true">
    <custom-filter ref="authenticationFilter" position="FORM_LOGIN_FILTER" />
    <intercept-url access="hasRole('ROLE_ADMIN')" pattern="/common/admin/**" />
    <intercept-url pattern="/common/accounting/**" access="hasRole('ROLE_USER')" />
    <intercept-url pattern="/common/billing/**" access="hasRole('ROLE_COMPANY')" />
    <logout logout-success-url="/" logout-url="/logout"/>

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

在控制器中我添加如下

@Secure("ROLE_ADMIN")
@RequestMapping(value = "/common/admin/addAdmin", method = RequestMethod.GET)
    public String add(ModelMap map) {
        map.addAttribute(new Administrator());
        return "/common/admin/addAdmin";
    }

我是否需要配置或导入某些课程?

2 个答案:

答案 0 :(得分:1)

Cannot resolve reference to bean 'accessDecisionManager' while setting bean property 'accessDecisionManager'; nested exception is
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'accessDecisionManager' is defined 

Spring应该为您创建一个默认的accessDecisionManager,但看起来似乎没有发生,可能是由于某些配置问题。只是为了解决如果你在http配置中将auto-config设置为true会发生什么?

答案 1 :(得分:0)

<bean id="accessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased" xmlns="http://www.springframework.org/schema/beans">
    <constructor-arg>
        <list>
            <bean class="org.springframework.security.oauth2.provider.vote.ScopeVoter" />
            <bean class="org.springframework.security.access.vote.RoleVoter" />
            <bean class="org.springframework.security.access.vote.AuthenticatedVoter" />
        </list>
    </constructor-arg>
</bean>

你必须定义这个bean。