<sec:authorize> 不起作用

Posted

技术标签:

【中文标题】<sec:authorize> 不起作用【英文标题】:<sec:authorize> doesn't work 【发布时间】:2014-06-14 08:42:17 【问题描述】:

我有以下用户 xhtml 页面:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:sec="http://www.springframework.org/security/tags">
<head>
<title>User</title>
</head>

<body>
    <p>User</p>
    <sec:authorize access="hasRole('ROLE_ADMIN')">
        <p>Only admin can see this !</p>
    </sec:authorize>
</body>
</html>

但是当我使用没有角色 ROLE_ADMIN 的用户访问该页面时,他仍然可以看到“只有管理员才能看到这个!”


编辑:

这是我的 spring 安全配置:

<?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"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/security 
        http://www.springframework.org/schema/security/spring-security-3.2.xsd
        http://www.springframework.org/schema/util 
        http://www.springframework.org/schema/util/spring-util-3.2.xsd">

    <http pattern="/resources" security="none" />

    <http auto-config="true" use-expressions="true">
        <intercept-url pattern="/login**" access="permitAll" />

        <intercept-url pattern="/denied**" access="permitAll" />
        <intercept-url pattern="/user/*" access="hasRole('ROLE_USER')" />
        <intercept-url pattern="/admin/*" access="hasRole('ROLE_ADMIN')" />


        <form-login login-page="/login.xhtml"
            authentication-failure-url="/denied.xhtml"
            authentication-success-handler-ref="securityAuthenticationSuccessHandler" />

        <access-denied-handler error-page="/denied.xhtml" />

        <logout logout-success-url="/login.xhtml" delete-cookies="JSESSIONID"
            invalidate-session="true" />
    </http>

    <authentication-manager>
        <authentication-provider user-service-ref="securityProviderServiceImpl">
            <password-encoder hash="md5" />
        </authentication-provider>
    </authentication-manager>
</beans:beans>

有什么问题吗?

谢谢你..


编辑 2:

我对安全标签库 "xmlns:sec="http://www.springframework.org/security/tags""

有一个警告 >
NLS missing message: CANNOT_FIND_FACELET_TAGLIB in: org.eclipse.jst.jsf.core.validation.internal.facelet.messages

重要吗?这是问题的原因吗?

我的 Maven 安全依赖项:

        <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-core</artifactId>
                <version>$org.springframework.security.version</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>$org.springframework.security.version</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>$org.springframework.security.version</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
            <version>$org.springframework.security.version</version>
        </dependency>

【问题讨论】:

配置看起来正确。您是否在没有重新启动浏览器的情况下测试页面时更改了权限?用户权限是 Spring Security 中的会话范围。 @Conan 对不起,我不明白“在不重新启动浏览器的情况下测试页面时更改权限”是什么意思,但我已经用多个用户测试了该页面(具有不同的角色, admin 而不是 admin)并且每次它确实显示“只有管理员可以看到这个!”...我认为它根本无法识别标签 ....但是为什么? @Conan(和所有人),我是否缺少依赖项? 另一种可能的解决方案:***.com/questions/32904857/… 【参考方案1】:

在这里添加一个答案,因为我有相同的症状,但发现了一个不同的问题。 我们的标签没有按预期工作。每个人都可以看到受保护的内容。 解决方案是我们的 XML 命名空间在页面上拼写错误。

 xmlns="http://www.sprinfgramework.org/schema/security"

这需要一段时间才能找到,因为拼写错误没有产生任何错误(这令人惊讶),它只是忽略了安全标签并显示了它包含的内容。

希望这对某人有所帮助。

【讨论】:

【参考方案2】:

我终于解决了这个问题。

以下是对我帮助很大的链接:

1)“Amreesh Tyagi”的答案在这里How to use the Spring Security Facelets tag library in JSF。

2)本文第三部分(Facelet的III安全标签)http://doanduyhai.wordpress.com/2012/02/26/spring-security-part-v-security-tags/

我使用了 Amreesh Tyagi 的 springsecurity.taglib.xml 文件,而不是文章中的那个,因为我在访问功能方面遇到了问题。

【讨论】:

以上是关于<sec:authorize> 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

sec:authorize 对 Spring Security 不起作用

thymeleaf中security的sec:authorize标签不起作用的原因

thymeleaf中security的sec:authorize标签不起作用的原因

spring security3 动态从数据库中读取权限信息<sec:authorize>标签 url属性不起作用

<sec:authorize ifAnyGranted 或 ifAnyGranted 在 SPRING SECURITY 中不起作用

thymeleaf.extras.springsecurity4 sec:authorize 不起作用