gpt4 book ai didi

java - Spring Security 中缺少 ROLE_ANONYMOUS

转载 作者:行者123 更新时间:2023-12-04 05:32:51 25 4
gpt4 key购买 nike

我使用 Spring Security 2.x 已经有一段时间了,但最近我切换到了 3.x。我总是使用自己的 UserDetails 实现针对数据库的接口(interface)和身份验证。

一切正常(登录、注销、url 过滤器、查看授权用户的用户名等)。

剩下要做的就是在用户未被授权时显示“请登录”消息。我尝试了几种方法:

<sec:authorize access="not isAnonymous()">
or
<sec:authorize access="hasRole('ROLE_ANONYMOUS')">
etc.

他们都没有工作。最后我添加了 <sec:authentication property="principal.authorities" />到我的主页输出来调试用户真正拥有的角色。这就是我所看到的:
  • 登录用户 - [ROLE_USER, ROLE_ADMIN]
  • 未经授权的用户 - `` <- 空字符串

  • 看起来我不知何故丢失了默认 ROLE_ANONYMOUS权限,如果我没记错的话,它总是由 Spring 添加的。是最近掉了还是怎么的?也许我必须以其他方式处理这种匿名访问?

    安全上下文的相关部分:
    <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-3.0.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-3.1.xsd">

    <!-- UNPROTECTED RESOURCES -->
    <http pattern="/" security="none"/>
    <http pattern="/favicon.ico" security="none"/>
    <http pattern="/home" security="none"/>
    <http pattern="/login*" security="none"/>
    <http pattern="/resources/**" security="none"/>

    <!-- PROTECTED RESOURCES -->
    <http auto-config='true' use-expressions="true">
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
    <intercept-url pattern="/admin/**" access="hasRole('ROLE_USER,ROLE_ADMIN')"/>
    <form-login login-page="/login" default-target-url="/dashboard" authentication-failure-url="/login?login_error=true"/>
    <logout logout-url="/logout"/>
    </http>

    <beans:bean id="userAccountsAuthenticationProvider" class="pl.xxx.utils.UserAccountsAuthenticationProvider" />

    <beans:bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource">
    <beans:property name="userPropertyToUse" value="salt" />
    </beans:bean>

    <authentication-manager>
    <authentication-provider user-service-ref="userAccountsAuthenticationProvider">
    <password-encoder ref="standardPasswordEncoder"/>
    </authentication-provider>
    </authentication-manager>
    </beans:beans>

    最佳答案

    可以通过几种不同的方式配置匿名身份验证 - 你使用 <http auto-config="true"> , <anonymous>自己标记或定义bean作为自定义过滤器?如果您发布您的 security-context.xml 会更容易。

    无论如何,你想显示“请登录”,所以我假设你真的想要

    <sec:authorize access="isAnonymous()">Please login</sec:authorize>

    没有“not”(顺便说一句,我找不到“not”在这种情况下是否是表达式的有效部分)。

    另一种方法是使用 isAuthenticated()相反,在 EL 中否定它,看看它是否适用于您的情况:
    <sec:authorize access="isAuthenticated()" var="isAuthenticated" />
    <c:if test="${not isAuthenticated}">
    <!-- do stuff -->
    </c:if>

    编辑:

    更改 security="none"access="IS_AUTHENTICATED_ANONYMOUSLY"并将选择的模式移动到拦截网址。它应该启用 Spring Security 的过滤器链并应用 AnonymousAuthenticationFilter根据要求:
    <!-- UNPROTECTED RESOURCES -->
    <http pattern="/favicon.ico" security="none"/>
    <http pattern="/resources/**" security="none"/>

    <!-- PROTECTED RESOURCES -->
    <http auto-config='true' use-expressions="true">
    <intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/home" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
    <intercept-url pattern="/admin/**" access="hasRole('ROLE_USER,ROLE_ADMIN')"/>
    <form-login login-page="/login" default-target-url="/dashboard" authentication-failure-url="/login?login_error=true"/>
    <logout logout-url="/logout"/>
    </http>

    假设你想使用 isAnonymous()/ , /home/login* .

    我以前的解决方案有效,因为 security="none"检查 isAuthenticated() 总是 产生假,所以否定它就像检查没有被记录。

    关于java - Spring Security 中缺少 ROLE_ANONYMOUS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12358824/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com