当前位置: 首页 > 知识库问答 >
问题:

Java Spring 安全访问决策管理器:基于一致无法解析表达式“ROLE_ADMIN,IS_AUTHENTICATED_FULLY”

单于高逸
2023-03-14

我试图用Spring安全性进行一些简单的回忆身份验证,但是当我尝试实现accesdcisionManager时,我发现了这个错误。这里的错误日志:

创建名称为“组织”Spring框架“安全过滤器链”的 Bean 时出错:在使用键 [0] 设置 Bean 属性“源列表”时,无法解析对 Bean “组织”Spring框架.web.默认安全过滤器链 #0“的引用;嵌套的异常是组织.springframework.beans.factory.Bean创建异常:使用键 [10] 设置构造函数参数时,无法解析对 Bean 的引用,而使用键 [10] 设置构造函数参数;嵌套的异常是组织.springframework.beans.factory.Bean创建异常:在设置 Bean 属性“安全虚拟数据源”时,无法创建类型为 “组织.springframework.security.web.access.expression.Expression]的 Bean 时出错。嵌套的异常是组织.Spring框架.豆.工厂.豆创建异常: 创建名称为'(内豆)#19'的豆时出错: 豆子的实例化失败;嵌套异常是组织.Spring框架.豆.豆子实例化异常: 无法实例化 Bean 类 [组织.Spring框架.security.web.access.expression.表达式基于过滤器调用安全元数据来源]: 构造函数抛出异常;嵌套的异常是 java.lang.非法描述异常:无法解析表达式“ROLE_ADMIN,IS_AUTHENTICATED_FULLY”

这是我的xml文件。web.xml

<web-app id="WebApp_ID" 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_4.xsd">

<display-name>Spring Security Eksplorasi</display-name>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Spring MVC -->
<servlet>
    <servlet-name>kampus</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>kampus</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<!-- Spring Security -->
<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>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring-database.xml,
        /WEB-INF/spring-security.xml
    </param-value>
</context-param>

这是我的spring-security.xml

    <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="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.1.xsd">

    <beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased">
        <beans:property name="decisionVoters">
            <beans:list>
                <beans:bean class="org.springframework.security.access.vote.RoleVoter">
                    <beans:property name="rolePrefix" value="ROLE_"/>
                </beans:bean>
                <beans:bean class="org.springframework.security.access.vote.AuthenticatedVoter"/>
            </beans:list>
        </beans:property>
    </beans:bean>

    <security:http auto-config="true" use-expressions="true" access-decision-manager-ref="accessDecisionManager">
        <security:remember-me key="kampus-rememberme" data-source-ref="dataSource" />
        <security:intercept-url pattern="/admin/*" access="ROLE_ADMIN, IS_AUTHENTICATED_FULLY" />
        <security:access-denied-handler error-page="/403" />
        <security:form-login 
            login-page="/login" 
            default-target-url="/welcome" 
            authentication-failure-url="/login?error" 
            username-parameter="username"
            password-parameter="password" />
        <security:logout logout-success-url="/login?logout"  />
        <!-- enable csrf protection 
        <csrf/>-->
    </security:http>
    <!-- 
    <bean id="accessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased">
        <constructor-arg>
            <list>
                <bean class="org.springframework.security.access.vote.RoleVoter" />
                <bean class="org.springframework.security.access.vote.AuthenticatedVoter" />
            </list>
        </constructor-arg>
    </bean>
     -->

    <security:authentication-manager>
        <security:authentication-provider>
            <security:jdbc-user-service data-source-ref="dataSource"
                users-by-username-query=
                    "select username,password, status from users where username=?"
                authorities-by-username-query=
                    "select username, role from user_roles where username =?  " />
        </security:authentication-provider>
    </security:authentication-manager>

</beans>

非常感谢你的帮助,朋友。

共有2个答案

关浩壤
2023-03-14

您正在使用基于表达式的权限改造(默认情况下,您使用use表达式="true"显式声明它)和ROLE_ADMIN,IS_AUTHENTICATED_FULLY不是一个有效的表达式,而是一个"旧样式"角色列表,因此要么将use表达式设置为false,要么将"旧样式"角色列表替换为表达式hasRole('ROLE_ADMIN')或isFullyAuthenticated()

戚学
2023-03-14

可能您只需要删除access属性中的空白:

access="ROLE_ADMIN, IS_AUTHENTICATED_FULLY"

access="ROLE_ADMIN,IS_AUTHENTICATED_FULLY"

如果这不起作用,尝试一下:

access="hasAnyRole('ROLE_ADMIN', 'IS_AUTHENTICATED_FULLY')"

类似的问题:Spring Security 3指定多个拦截-url访问角色

检查Teja的答案。

 类似资料:
  • 问题内容: 如何允许用户以安全的方式执行数学表达式?我需要写一个完整的解析器吗? 是否有类似ast.literal_eval()的东西,但用于表达式? 问题答案: “ Pyparsing示例”页面列出了几个表达式解析器: http://pyparsing.wikispaces.com/file/view/fourFn.py-使用pyparsing的常规算术中缀表示法解析器/评估器实现(尽管它的名称

  • 这一章节假设你有一些Spring Security中访问控制的底层架构的知识。如果没有,你可以跳过他,后面再来看,这部分针对那些真正需要进行一些定制而不是简单的基于角色的安全的用户。 当你使用命名空间配置时,一个AccessDecisionManager实例将会被自动创建并注册用来按照你在intercept-url和protect-pointcut(还有如果你使用了方法注解安全也包含在内)定义的访

  • 有人能帮我理解为什么我对elasticsearch分析器的理解是错误的吗? 我有一个包含各种字段的索引,特别是: 如下所示: 并且 的理解是,它将标记一个句子,以便在出现任意数量的或或时拆分它们。例如,给定模式,以下句子: 我希望看到: 我可以从https://regex101.com/ 然而,当我对上面的句子运行words\u only\u分析器时: 我得到, 这告诉我句子被标记为: 在我看来,

  • 问题内容: 尝试在模板中合并多个值时遇到问题。根据Thymeleaf的说法,我应该可以将它们+一起组合在一起… 4.6合并文本 文本,无论它们是文字还是评估变量或消息表达式的结果,都可以使用+运算符轻松连接: 这是我发现有效的示例: 但是,这不是: 从逻辑上讲,这应该可以,但是不能,我在做什么错? Maven: 这是我设置TemplateEngine和TemplateResolver的方法: Th

  • 我正在寻找一个JAVA库来解析 我的要求: 支持所有的值类型(例如int,双,布尔,String等) 支持所有已知的数学 有什么建议吗?

  • 本文向大家介绍Python中 Lambda表达式全面解析,包括了Python中 Lambda表达式全面解析的使用技巧和注意事项,需要的朋友参考一下 什么是Lambda表达式 “Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函