我创建了两个具有ADMIN和USER角色的用户,但是每次尝试登录服务器时返回403。
WebSecurityConfig:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/admin/**")
.access("hasAnyAuthority('ADMIN','USER')")
.and().formLogin().loginPage("/login").failureUrl("/login?error")
.usernameParameter("username")
.passwordParameter("password")
.and().logout().logoutSuccessUrl("/login?logout")
.and().csrf().disable();
}
我的UserService从数据库映射我的用户:
@Transactional(readOnly = true)
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userDao.findByUserName(username);
org.springframework.security.core.userdetails.User.UserBuilder builder = null;
if (user != null) {
builder = org.springframework.security.core.userdetails.User.withUsername(username);
builder.disabled(!user.isEnabled());
builder.password(user.getPassword());
String[] authorities = user.getUserRole()
.stream().map(a -> a.getRole()).toArray(String[]::new);
builder.authorities(authorities);
} else {
throw new UsernameNotFoundException("User not found.");
}
return builder.build();
}
csrf已禁用。我也使用hasAnyUthority *方法,因此不需要ROLE_前缀。 我使用Spring Security 5
我的login.html
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="resources/style.css"/>
</head>
<body>
<div class="container">
<header>
<h1>Login</h1>
</header>
<div class="alert alert-error" th:if="${error != null}">
<div>
<strong>Okay, Houston, we've had a problem here.</strong>
</div>
</div>
<div class="alert alert-error" th:if="${logout != null}">
<div>
<strong>Okay, Houston, you're logged out successfully .</strong>
</div>
</div>
<form class="form-horizontal" th:action="@{/login}" method="POST">
<fieldset>
<div class="control-group">
<label class="control-label">Login</label>
<div class="controls">
<div class="input-prepend">
<span class="add-on">@</span>
<input id="loginField" name="username" class="span3" type="text"/>
</div>
</div>
</div>
<div class="control-group">
<label class="control-label">Password</label>
<div class="controls">
<input id="passwordField" name="password" class="span3" type="password"/>
</div>
</div>
<div class="form-actions">
<button id="loginButton" class="btn btn-primary" type="submit">Login</button>
</div>
</fieldset>
</form>
</div>
</body>
我已经完成了示例项目中的所有操作,但是它仍然不想登录。
答案 0 :(得分:0)
我看不到hasAnyAuthority(...)
在没有“ ROLE_”的情况下也可以使用,请尝试.access("hasAnyRole('ADMIN','USER')")
或.access("hasAnyRole('ROLE_ADMIN','ROLE_USER')")
。
请注意,在String[] authorities = user.getUserRole().stream().map(a -> a.getRole()).toArray(String[]::new);
中,您需要在a.getRole()
中返回带有前缀ROLE_
或与hasAnyAuthority(...)
中相同的字符
例如,如果您的a.getRole()
返回WHAT_EVER
而不是hasAnyAuthority('WHAT_EVER)
应该起作用,但是hasAnyRole('WHAT_EVER')
会期望a.getRole()
返回ROLE_WHAT_EVER
>
答案 1 :(得分:0)
也许它将帮助某人,所以我将不提出我的问题。 启动程序时无法登录,我添加了一些未加密密码的新用户。但是无论如何,Spring Security都会解密它,所以这就是为什么我无法登录并获得403回复的原因。我所需要做的就是在将密码添加到数据库之前对其进行加密。