gpt4 book ai didi

java - Spring Security jsp 授权标签不起作用

转载 作者:行者123 更新时间:2023-11-29 08:43:24 24 4
gpt4 key购买 nike

我有以下 spring 安全配置:

<security:http auto-config="true">  
<security:intercept-url pattern="/**" access="permitAll" />
<security:form-login
login-processing-url="/j_spring_security_check"
login-page="/login"
default-target-url="/"
authentication-failure-url="/login?error"
username-parameter="login"
password-parameter="password" />
<security:logout logout-url="/j_spring_security_logout" logout-success-url="/login" />
<security:csrf disabled="true"/>
</security:http>

我想让每个人(经过身份验证的用户和未经身份验证的用户)都可以访问特定页面(比方说索引页面(“/”)),但同时,能够管理哪些部分应该在jsp 取决于用户是否经过身份验证及其角色。

我的 jsp 部分如下所示:

<%@ page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:main>
<jsp:attribute name="title">
Posts
</jsp:attribute>
<jsp:body>
<sec:authorize access="hasRole('ADMIN')">
<a href="/blog/createPost">Create post</a>
</sec:authorize>

<br>

<c:forEach var="post" items="${posts}">
<hr width="300" align="left">
<div>
<h4><a href="/blog/viewPost/${post.id}">${post.title}</a></h4>
<div>${post.content}</div>
</div>
</c:forEach>
</jsp:body>
</t:main>

所有身份验证机制都可以正常工作。 问题是,即使我使用“管理员”角色登录,链接也永远不会显示

我尝试调试我的 UserDetailsS​​ervice 实现并验证“ADMIN”角色已成功获取并填充到 userdetails 中:

@Override
public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException {
User user = userDao.findOneByLogin(login);

if (user == null) {
throw new UsernameNotFoundException(login + " not found");
}

List<GrantedAuthority> authList = new ArrayList<>();
List<Role> roles = user.getRoles();

for (Role role : roles) {
authList.add(new SimpleGrantedAuthority(role.getName()));
}

return new org.springframework.security.core.userdetails.User(
user.getLogin(), user.getPassword(), authList);
}

提前致谢!

最佳答案

经过几个小时的搜索和阅读 Spring Security 4 文档,我终于明白了问题的原因。

这是来自 spring 文档的一些信息:

hasRole([role])

Returns true if the current principal has the specified role. By default if the supplied role does not start with 'ROLE_' it will be added. This can be customized by modifying the defaultRolePrefix on DefaultWebSecurityExpressionHandler.

hasAuthority([authority])

Returns true if the current principal has the specified authority.

因此,根据上面的陈述,我们可以得出结论,默认情况下,Spring Security 4 期望您所有的“角色”以“ROLE_”前缀开头,而所有其他角色都被威胁为简单的权限/权限。

在我的例子中,我在数据库中保存了“ADMIN”角色,每当我尝试检查像 hasRole('ADMIN') 这样的角色时,Spring 都会将其转换为 hasRole('ROLE_ADMIN') ,从而将此表达式评估为 false。

这里有两种类型的修复,要么我在数据库中将我的“ADMIN”角色重命名为“ROLE_ADMIN”(如 Spring 所期望的那样),要么使用 hasAuthority('ADMIN') 表达式相反。

关于java - Spring Security jsp 授权标签不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38303278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com