我有以下Spring Security配置:
<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>
所有的认证机制都可以正常工作。问题是,即使我使用“管理员”角色登录,链接也永远不会显示。
我尝试调试我的userdetails服务实现,并验证“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);
}
提前谢谢!
您的问题似乎在配置中。要使用hasRole
,hasAnyRole
表达式,需要在security:http
标记中设置use expressions=“true”
。
<security:http auto-config="true" use-expressions="true">
否则,您必须直接在安全标签中使用角色名称,
<sec:authorize access="ADMIN">
<a href="/blog/createPost">Create post</a>
</sec:authorize>
经过几个小时的搜索和阅读Spring Security 4文档,终于,我意识到问题的原因。
以下是来自spring docs的一些信息:
hasRole([角色])
如果当前主体具有指定的角色,则返回true。默认情况下,如果提供的角色不是以ROLE_开头,则将添加该角色。这可以通过修改DefaultWebSecurityExpressionHandler上的defaultRolePrefix来自定义。
##############################################################################################
如果当前主体具有指定的权限,则返回true。
因此,根据上面的陈述,我们可以得出结论,在默认情况下,Spring Security 4希望您的所有“角色”都以“角色”前缀开头,而其他所有角色都被威胁为简单的权限/权限。
在我的例子中,我在数据库中保存了“ADMIN”角色,每当我尝试检查像hasRole('ADMIN')
Spring这样的角色时,我都会将其转换为hasRole('role_ADMIN')
,从而将这个表达式计算为false。
这里有两种修复方法,要么我在数据库中将我的“ADMIN”角色重命名为“role_ADMIN”(正如Spring所期望的那样),要么使用hasAuthority('ADMIN')
表达式。
我正在尝试使用Spring Boot、Spring Security4、Thymeleaf,如果用户有角色“admin”或其他任何东西,html块应该会显示出来,但现在它总是显示在页面上。这是我的html 这里是我的pom.xml,我添加了thymeleaf-extras-springsecurity4。还尝试了thymeleaf-extras-springsecurity3 这是我的securi
我发现了许多类似的问题,但没有一个解决了我的问题。我的问题是可以访问的函数 下面是我的spring-security.xml代码。
我尝试使用JQuery Ajax进行基本身份验证。我像这样向ajax请求添加授权标头。 然后在ASP. Net Web服务中,我尝试获取此标头。 当我打印到标题时,我看不到授权标题 缓存控制:无缓存连接:保持活动状态Pragma:无缓存接受:接受编码:gzip,deflate接受语言:tr tr,tr;q=0.9,en-US;q=0.8,en;q=0.7主机:示例。com参考:http://loc
默认情况下,SEC:authorize-URL标记不适用于Spring boot security: 添加依赖项 我是不是漏掉了什么?这是预期的行为吗?我需要定义什么才能使authorize-url像使用XML配置安全性时那样工作? 此问题与SpringBootWebSecurityConfiguration中的基本身份验证及其自动配置有关: 在SampleMethodSecurityApplic
我是一名初学者,使用来验证我的节点中的用户。js web应用程序。我在<code>应用程序中签署了jwt令牌。post('/login')使用,当我尝试在它给出null或中没有授权头。 但它可以在邮递员中访问或验证,因为我在那里将身份验证类型设置为<code>bearer 然后,我使用< code>res.cookie('token ',accessToken)将令牌存储在cookie中,并且我可
我正在尝试使用aws api网关授权器和cognito用户池。当我使用aws api网关控制台进行测试时,它工作得很好。 但当我尝试在api中启用授权时,它显示请查看下面的屏幕截图 有人能帮忙吗。