在授权Spring安全标记中访问托管的JSF bean

时间:2017-12-11 12:04:08

标签: spring security jsf el authorize

我实现了Spring security 4.2.3。在JSF-2.2 Web应用程序中,它到目前为止工作正常。现在我在从spring security的authorize标签访问jsf bean方法时遇到了问题。

这是我的xhtml数据表,我需要根据项目数据拒绝某些行的访问:

<p:dataTable var="item" value="#{itemService.items}">
    <p:column headerText="Id">
        <h:outputText value="#{item.id}" />
    </p:column>

    <p:column headerText="Name">
        <h:outputText value="#{item.name}" />
    </p:column>

    <p:column headerText="Security">
        <sec:authorize access="#{securityService.checkAccessByItemId(item.id)}">
            <h:outputLabel value="#{helloWorld.secure}"/>
        </sec:authorize>
    </p:column>
</p:dataTable>

这里我的bean只是用于测试:

@ManagedBean(name="securityService")
@RequestScoped
public class SecurityService {

    public boolean checkAccessByItemId(int id) {
        if(id==5) {
            return false;
        } else {
            return true;
        }
    }
}

这是我的taglib.xml:

<facelet-taglib>
   <namespace>http://www.springframework.org/security/tags</namespace>
    <tag>
        <tag-name>authorize</tag-name>
        <handler class>org.springframework.faces.security.FaceletsAuthorizeTagHandler</handler-class>
    </tag>
</facelet-taglib>

我得到了这个例外:

org.springframework.expression.spel.SpelParseException: Expression [#{securityService.checkAccessByItemId(item.id)}] @1: EL1043E: Unexpected token. Expected 'identifier' but was 'lcurly({)'
at org.springframework.expression.spel.standard.InternalSpelExpressionParser.raiseInternalException(InternalSpelExpressionParser.java:1006)

有没有人知道这方面的解决方案?

1 个答案:

答案 0 :(得分:0)

如果我正确地阅读了Spring-Security documentation for the authorize tag,那么它似乎不支持EL(如果你想调用你自己的bean来'验证'那么你为什么要使用authorize标签?只需使用{然后在outputLabel上输入{1}}属性。