在 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á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á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ões</button>');
row.append(col);
$('tbody.content').append(row);
);
);
);
</script>
</body>
</html>
【问题讨论】:
你的jsp中有<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
吗? (http://docs.spring.io/spring-security/site/docs/3.2.3.RELEASE/reference/htmlsingle/#declaring-the-taglib)
是的。它在文件 include.jsp 中,包含在我上面显示的页面中。
如何在<http>
和permissionEvaluator
属性中配置<expression-handler>
?可以分享一下你的 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】:
根据错误消息,在使用<sec:authorize access="hasPermission(...)">
时没有调用您的 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>?