弹簧安全返回 403,日志记录不起作用

Posted

技术标签:

【中文标题】弹簧安全返回 403,日志记录不起作用【英文标题】:spring security return 403, logging not working 【发布时间】:2017-06-01 18:40:20 【问题描述】:

我无法让 Spring Security 工作。我用security:user-service 测试了我的应用程序,它运行良好。但是,当我更换

<security:user-service>
    <security:user name="XX" password="XX" authorities="ROLE_EDITOR" />                
</security:user-service>

<security:authentication-manager alias="authenticationManager">
    <security:authentication-provider>
        <security:jdbc-user-service data-source-ref="dataSource" 
            users-by-username-query="SELECT name as username, password, 1 as enabled FROM cuser WHERE name=?;"
            authorities-by-username-query="SELECT u.name as username, r.name as authority FROM cuser u join cuserrole ur on ur.iduser=u.id join crole r on r.id=ur.idrole where u.name=?;" />
    </security:authentication-provider>
</security:authentication-manager>

我不能再让它工作了。不断收到来自服务器的 403 响应。我在我的数据库上运行了查询,它们返回了预期值。

我也无法使日志记录工作,所以我发现很难调试幕后真正发生的事情。 我确实在 SO 上阅读过类似的问题

How do I enable logging for Spring Security?

Debugging Spring configuration

尝试了解决方案,但日志仍然不起作用。如果有人有任何想法,您的帮助将不胜感激。

【问题讨论】:

【参考方案1】:

不敢相信..

Spring 需要 ROLE_ 前缀才能安全工作。因此我得到 403。

【讨论】:

有人能告诉我为什么 ROLE_ 前缀吗?谢谢 我不能使用我手工制作的角色名称吗?【参考方案2】:

RoleVoter 类有一个属性 rolePrefix 的设置器

public class RoleVoter implements AccessDecisionVoter<Object> 
    // ~ Instance fields
    // ================================================================================================

    private String rolePrefix = "ROLE_";

    // ~ Methods
    // ========================================================================================================

    public String getRolePrefix() 
        return rolePrefix;
    

    /**
     * Allows the default role prefix of <code>ROLE_</code> to be overridden. May be set
     * to an empty value, although this is usually not desirable.
     *
     * @param rolePrefix the new prefix
     */
    public void setRolePrefix(String rolePrefix) 
        this.rolePrefix = rolePrefix;

所以您可以在 RoleVoter 中设置此属性,然后设置到 AccessDecissionManager 并将其配置为 spring security http 配置中的 access-decission-manager-ref

【讨论】:

以上是关于弹簧安全返回 403,日志记录不起作用的主要内容,如果未能解决你的问题,请参考以下文章

禁用弹簧安全不起作用[重复]

@PreAuthorize 注释不起作用弹簧安全性

为啥弹簧测试失败,不起作用@MockBean

Spring Security 角色不起作用

自动 IIS6 403.4 重定向到 SSL 不起作用

春季安全+休息不起作用