最近在弄一个acegi到spring security2的迁移,
数据在数据库中,是经典的user,role,user-role,resource,role-resource的结构
迁移过程中 找不到很好的文档,也没找到 spring security代码解析的文章,照着 别人说的方法配置了半天还是出错
这是配置文件<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="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-2.0.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-2.0.4.xsd"> <authentication-manager alias="authenticationManager"/>
<!-- 
<beans:bean id="accessDecisionManager" class="org.springframework.security.vote.AffirmativeBased">
<beans:property name="allowIfAllAbstainDecisions" value="false"/>
<beans:property name="decisionVoters">
<beans:list>
<beans:bean class="org.springframework.security.vote.RoleVoter"/>
<beans:bean class="org.springframework.security.vote.AuthenticatedVoter"/>
</beans:list>
</beans:property>
</beans:bean>

<beans:bean id="filterInvocationInterceptor" class="org.springframework.security.intercept.web.FilterSecurityInterceptor">
<beans:property name="authenticationManager" ref="authenticationManager"/>
<beans:property name="accessDecisionManager" ref="accessDecisionManager"/>
<beans:property name="objectDefinitionSource" ref="secureResourceFilter" />
</beans:bean>

<beans:bean id="secureResourceFilter" class="com.mpc.security.resourcedetails.MySecureResourceFilter"></beans:bean>
-->
<beans:bean id="filterInvocationDefinitionSource"
    class="com.mpc.security.resourcedetails.JdbcFilterInvocationDefinitionSourceFactoryBean">
    <beans:property name="dataSource" ref="dataSource"/>
    <beans:property name="resourceQuery" value="
        这里的代码没有什么问题,测试过
    "/>
    
</beans:bean>
<beans:bean id="filterSecurityInterceptor"
     class="org.springframework.security.intercept.web.FilterSecurityInterceptor" autowire="byType">
     <custom-filter before="FILTER_SECURITY_INTERCEPTOR" />
     <beans:property name="objectDefinitionSource" ref="filterInvocationDefinitionSource"/>
     <!--<beans:property name="accessDecisionManager" ref="accessDecisionManager"/>-->
</beans:bean>
 
<http auto-config="true" access-denied-page="/403.jsp">
     <concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="true" />
      <form-login login-page="/login.jsp" 
      authentication-failure-url="/login.jsp?error=1" 
      default-target-url="/index.jsp" />
     <logout logout-success-url="/login.jsp"/>
</http>
<beans:bean id="loggerListener" class="org.springframework.security.event.authentication.LoggerListener"/> <authentication-provider >
<jdbc-user-service 
data-source-ref="dataSource" 
users-by-username-query="略"
authorities-by-username-query="略"/>
</authentication-provider></beans:beans>总是会报一个错误脑袋比较大,看不进去。想要分的给分析一下,最好深入分析一下为什么会出错  谢过了!

解决方案 »

  1.   


    2009-12-02 15:45:43,656 [test] ERROR [main] ContextLoader.initWebApplicationContext(215) | Context initialization failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name '_filterChainList': Cannot create inner bean '(inner bean)' of type [org.springframework.security.config.OrderedFilterBeanDefinitionDecorator$OrderedFilterDecorator] while setting bean property 'filters' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Cannot resolve reference to bean 'filterSecurityInterceptor' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'filterSecurityInterceptor' defined in ServletContext resource [/WEB-INF/applicationContext-springSecurity.xml]: Cannot resolve reference to bean 'filterInvocationDefinitionSource' while setting bean property 'objectDefinitionSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'filterInvocationDefinitionSource': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:230)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:122)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:287)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:126)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1244)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1008)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:470)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:217)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3764)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4216)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:760)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:740)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:544)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1022)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:448)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
      

  2.   

        <beans:bean id="filterInvocationDefinitionSource"
            class="com.mpc.security.resourcedetails.JdbcFilterInvocationDefinitionSourceFactoryBean">
            <beans:property name="dataSource" ref="dataSource"/>
            <beans:property name="resourceQuery" value="
                这里的代码没有什么问题,测试过
            "/>貌似没有找到dataSource的bean的定义
    楼主报的错貌似也是bean的创建问题
      

  3.   

    dataSource没有问题,在其他的application里配置的,而且我大概跟了一下可以连上取出数据, va:433)
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Cannot resolve reference to bean 'filterInvocationInterceptor' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'filterInvocationInterceptor' defined in ServletContext resource [/WEB-INF/applicationContext-springSecurity.xml]: Cannot resolve reference to bean 'filterInvocationDefinitionSource' while setting bean property 'objectDefinitionSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'filterInvocationDefinitionSource': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:458)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:160)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:923)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:833)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:440)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:219)
    ... 44 more
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'filterInvocationInterceptor' defined in ServletContext resource [/WEB-INF/applicationContext-springSecurity.xml]: Cannot resolve reference to bean 'filterInvocationDefinitionSource' while setting bean property 'objectDefinitionSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'filterInvocationDefinitionSource': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1244)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1008)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:470)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:217)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
    ... 54 more
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'filterInvocationDefinitionSource': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport$1.run(FactoryBeanRegistrySupport.java:127)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:116)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:91)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1285)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:217)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
    ... 67 more
    Caused by: java.lang.NullPointerException
    at org.springframework.security.intercept.web.RequestKey.hashCode(RequestKey.java:31)
    at java.util.HashMap.hash(HashMap.java:264)
    at java.util.HashMap.put(HashMap.java:382)
    at com.mpc.security.resourcedetails.JdbcFilterInvocationDefinitionSourceFactoryBean.buildRequestMap(JdbcFilterInvocationDefinitionSourceFactoryBean.java:72)
    at com.mpc.security.resourcedetails.JdbcFilterInvocationDefinitionSourceFactoryBean.getObject(JdbcFilterInvocationDefinitionSourceFactoryBean.java:37)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport$1.run(FactoryBeanRegistrySupport.java:121)
    ... 75 more
      

  4.   

    bean我也是从网上找的
    public class JdbcFilterInvocationDefinitionSourceFactoryBean
        extends JdbcDaoSupport implements FactoryBean{
        private String resourceQuery;
        //private FilterInvocationDefinitionSource fids;
        public boolean isSingleton() {
            return true;
        }    public Class getObjectType() {
            return FilterInvocationDefinitionSource.class;
        }    public Object getObject() {
            return new DefaultFilterInvocationDefinitionSource(this
                .getUrlMatcher(), this.buildRequestMap());
        }    protected Map<String, String> findResources() {
            ResourceMapping resourceMapping = new ResourceMapping(getDataSource(),
                    resourceQuery);        Map<String, String> resourceMap = new LinkedHashMap<String, String>();        for (Resource resource : (List<Resource>) resourceMapping.execute()) {
                String url = resource.getUrl();
                String role = resource.getRole();            if (resourceMap.containsKey(url)) {
                    String value = resourceMap.get(url);
                    resourceMap.put(url, value + "," + role);
                } else {
                    resourceMap.put(url, role);
                }
            }        return resourceMap;
        }    protected LinkedHashMap<RequestKey, ConfigAttributeDefinition> buildRequestMap() {
            LinkedHashMap<RequestKey, ConfigAttributeDefinition> requestMap = null;
            requestMap = new LinkedHashMap<RequestKey, ConfigAttributeDefinition>();        ConfigAttributeEditor editor = new ConfigAttributeEditor();        Map<String, String> resourceMap = this.findResources();        for (Map.Entry<String, String> entry : resourceMap.entrySet()) {
                RequestKey key = new RequestKey(entry.getKey(), null);
                editor.setAsText(entry.getValue());
                requestMap.put(key,
                    (ConfigAttributeDefinition) editor.getValue());
            }        return requestMap;
        }    protected UrlMatcher getUrlMatcher() {
            return new AntUrlPathMatcher();
        }    public void setResourceQuery(String resourceQuery) {
            this.resourceQuery = resourceQuery;
        }    private class Resource {
            private String url;
            private String role;        public Resource(String url, String role) {
                this.url = url;
                this.role = role;
            }        public String getUrl() {
                return url;
            }        public String getRole() {
                return role;
            }
        }    private class ResourceMapping extends MappingSqlQuery {
            protected ResourceMapping(DataSource dataSource,
                String resourceQuery) {
                super(dataSource, resourceQuery);
                compile();
            }        protected Object mapRow(ResultSet rs, int rownum)
                throws SQLException {
                String url = rs.getString(1);
                String role = rs.getString(2);
                Resource resource = new Resource(url, role);            return resource;
            }
        }}
      

  5.   

    Spring Security 2 配置精讲
    http://www.javaeye.com/topic/319965
      

  6.   

    异常不是说的很清楚吗at com.mpc.security.resourcedetails.JdbcFilterInvocationDefinitionSourceFactoryBean.buildRequestMap(JdbcFilterInvocationDefinitionSourceFactoryBean.java:72)
      

  7.   

    问题搞定 没办法自己搞定的就不给分了。
    for (Map.Entry<String, String> entry : resourceMap.entrySet()) {
                RequestKey key = new RequestKey(entry.getKey(), null);
                editor.setAsText(entry.getValue());
                requestMap.put(key,
                    (ConfigAttributeDefinition) editor.getValue());其一是因为上述代码的key有null的情况
    然后这个问题改了之后 出现Unsupported configuration attributes这个错,
    是因为roleVoter 没有设置prefix属性,而role表里没有设置ROLE_开头。改掉 ok 成功启动。
    在用户登录后看不到任何菜单,也就是没有取出相应的权限,继续跟代码看。先结贴
      

  8.   

    最近开始研究spring security,感觉什么都不会啊,而且要一周之内搞定,郁闷中呢。