在 jsp 页面中使用标签 <sec:authorize> 在 eclipse 中显示错误

Posted

技术标签:

【中文标题】在 jsp 页面中使用标签 <sec:authorize> 在 eclipse 中显示错误【英文标题】:use of tag <sec:authorize> in the jsp pages displaying an error in eclipse 【发布时间】:2014-07-25 00:06:24 【问题描述】:

在我的spring项目中,我最近在我的jsp页面中添加了这个标签:

        <sec:authorize access="hasPermission(#user, 'altera_usuario')">
            col.append('<button type="button" class="btn btn-sm btn-primary link" data-action="$alteracao/'+item.id+'">Editar</button>');
        </sec:authorize>

        <sec:authorize access="hasPermission(#user, 'remove_usuario')">
            col.append('<button type="button" class="btn btn-sm btn-primary link" data-action="$remocao/'+item.id+'">Remover</button>');
        </sec:authorize>

允许我控制向用户显示的内容。但是 Eclipse 显示与此标签相关的错误(它们标有红色下划线),这不会阻止项目的构建。当我运行项目并打开页面时,尽管用户有权限,但标签内的元素不显示。

有人知道这里有什么问题吗?

ps.:该页面的完整代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
<%@ include file="../../include/include.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Lista de usu&aacute;rios</title>
</head>
<body>

<c:url value="/usuario/cadastra" var="cadastro"/>
<c:url value="/usuario/altera" var="alteracao"/>
<c:url value="/usuario/remove" var="remocao"/>
<c:url value="/permissao/altera" var="permissao"/>

<p>
<sec:authorize access="hasPermission(#user, 'cadastra_usuario')">
    <button type="button" class="btn btn-sm btn-link link" data-action="$cadastro">
        cadastrar novo usu&aacute;rio
    </button>
</sec:authorize>
</p>

<table class="bordered">

    <thead>
    <tr>
        <th>#</th>        
        <th>Login</th>
        <th>Nome</th>
        <th>Sobrenome</th>
        <th>E-Mail</th>
        <th>#</th>
    </tr>
    </thead>

    <tbody class="content">
    </tbody>

</table>

<c:url value="/usuario/listagem.json" var="lista"/>

<script>
$(document).ready(function()
    var url = "<c:out value="$lista"/>";
    $.get(url, function(data)
        var json = jQuery.parseJSON( data );
        $.each(json.usuario, function(index, item)
            var row = $('<tr id=user'+item.id+'>');
            row.append('<td>'+item.id+'</td>');
            row.append('<td>'+item.login+'</td>');
            row.append('<td>'+item.pnome+'</td>');
            row.append('<td>'+item.unome+'</td>');
            row.append('<td>'+item.email+'</td>');

            var col = $('<td>');

            <sec:authorize access="hasPermission(#user, 'altera_usuario')">
                col.append('<button type="button" class="btn btn-sm btn-primary link" data-action="$alteracao/'+item.id+'">Editar</button>');
            </sec:authorize>

            <sec:authorize access="hasPermission(#user, 'remove_usuario')">
                col.append('<button type="button" class="btn btn-sm btn-primary link" data-action="$remocao/'+item.id+'">Remover</button>');
            </sec:authorize>


            col.append('<button type="button" class="btn btn-sm btn-primary link" data-action="$permissao/'+item.id+'">Permiss&otilde;es</button>');
            row.append(col);

            $('tbody.content').append(row);
        );
    );
);
</script>

</body>
</html>

【问题讨论】:

你的jsp中有&lt;%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %&gt;吗? (http://docs.spring.io/spring-security/site/docs/3.2.3.RELEASE/reference/htmlsingle/#declaring-the-taglib) 是的。它在文件 include.jsp 中,包含在我上面显示的页面中。 如何在&lt;http&gt;permissionEvaluator 属性中配置&lt;expression-handler&gt;?可以分享一下你的 Spring 安全配置吗? 是否为页面上下文定义了“用户”?您是否尝试在您的 permissionEvaluator 中设置一个断点以查看标签权限调用中的值? 我猜“用户”已定义,因为我使用相同的结构来保护来自控制器/服务类的方法。执行视图时,控制台显示错误Jun 04, 2014 7:34:20 PM org.springframework.security.access.expression.DenyAllPermissionEvaluator hasPermission / Advertência: Denying user klebermo permission 'cadastra_usuario' on object null 【参考方案1】:

根据错误消息,在使用&lt;sec:authorize access="hasPermission(...)"&gt; 时没有调用您的 PermissionEvaluator 实现(DenyAllPermissionEvaluator 是 Spring Security 的默认实现)。

在您的 Spring Security 配置中尝试以下设置:

<http use-expressions="true" ...>
  <expression-handler ref="webExpressionHandler"/>
  ...
</http>

<beans:bean id="webExpressionHandler"
  class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler">
  <beans:property name="permissionEvaluator" ref="permissionEvaluator" />
</beans:bean>

<beans:bean id="permissionEvaluator" class="your.PermissionEvaluator" />

希望这会有所帮助。

【讨论】:

我的spring配置是基于java类的。你知道我在哪里可以找到用这种方法做同样事情的信息吗? This question 可以帮助您使用 Java config 配置 PermissionEvaluator 。我从 spring forum 和源代码 here 获得了这些信息。

以上是关于在 jsp 页面中使用标签 <sec:authorize> 在 eclipse 中显示错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JSP 页面的脚本标签中使用 <c:forEach>?

在jsp页面中使用jstl标签

JSP的标签技术

在 jsp 页面中使用标签 <sec:authorize> 在 eclipse 中显示错误

jsp动作标签

20160331javaweb之JSP 标签技术