spring-security - 无法使用 userDetailsService 进行授权
问题描述
我正在学习 Spring Security,这是我的配置类,很简单:
@Configuration
@EnableWebSecurity
public class Config extends WebSecurityConfigurerAdapter {
@Autowired
MyUserDetailsService myUserDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(myUserDetailsService);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/")
.permitAll()
.antMatchers("/users")
.hasRole("isAdmin")
.antMatchers("/articles")
.hasRole("isUser")
.and()
.formLogin()
.permitAll();
}
}
import org.springframework.security.core.userdetails.User;
@Service
public class MyUserDetailsService implements UserDetailsService {
@Autowired
UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
List<SimpleGrantedAuthority> simpleGrantedAuthorities = new ArrayList<>();
simpleGrantedAuthorities.add(new SimpleGrantedAuthority("isUser"));
return new User(username, "{noop}123456", simpleGrantedAuthorities);
}
}
从这个配置中,我允许任何人使用任何用户名和特定密码登录123456
,并且我给每个用户isUser
角色。
我希望任何人都可以使用任何用户名登录并获得访问许可/articles
。
但不幸的是,当我尝试登录时,是的,登录成功,但无法访问/articles
.
我找不到原因,我想已经给了用户权限,怎么了?
解决方案
答案可以在hasRole
方法(链接)的 javadoc 中找到:
指定 URL 的快捷方式需要特定的角色。如果您不想自动插入“ROLE_”,请参见 hasAuthority(String)。
参数: role - 需要的角色(即 USER、ADMIN 等)。注意,它不应该以“ROLE_”开头,因为它是自动插入的。
因此,要么ROLE_
为你的角色添加前缀isUser
,要么使用hasAuthority
方法而不是hasRole
.
推荐阅读
- linux-kernel - 没有访问正确的包
- c# - 为什么几个数相乘的结果与计算器中相乘的结果不同?
- r - 如何使用 r 抓取类的样式?
- javascript - 函数参数解构与主体中的解构
- azure - 我们可以使用本地 SQL Server 作为 AzureWebJobsStorage 运行容器化 Azure Functions 吗?
- java - SpringBoot 抛出异常 InvalidStatementException,如何解决?
- powerbi - 需要正确的总计,Power BI 表
- python - 如何在开始时抑制“Comet.ml Experiment Summary”控制台输出
- c# - 如何在 C# 中用符号拆分字母数字
- php - 如何在 macOS Catalina 或 Big Sur 上的 PHP 7.4 上安装 OCI8 扩展?