Java Spring security db UserDetails服务不支持';不要考虑用户的角色
我有一个玩具web应用程序,我想在其中登录从数据库中获取的用户 它可以工作,但是,我可以使用一个用户角色登录,我应该只使用一个具有管理员角色的用户登录 这是我的密码: Servlet 3.0引导程序Java Spring security db UserDetails服务不支持';不要考虑用户的角色,java,spring,security,login,Java,Spring,Security,Login,我有一个玩具web应用程序,我想在其中登录从数据库中获取的用户 它可以工作,但是,我可以使用一个用户角色登录,我应该只使用一个具有管理员角色的用户登录 这是我的密码: Servlet 3.0引导程序 public class Bootstraper extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClas
public class Bootstraper extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{JPAConfig.class, WebSecurityConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{MvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected Filter[] getServletFilters() {
return new Filter[]{new DelegatingFilterProxy("springSecurityFilterChain"), new OpenEntityManagerInViewFilter()};
}
}
My custome UserDetails服务:
@Service
public class MyUserDetailsService implements UserDetailsService {
@Autowired
private UsersService usersService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = usersService.getUser(username);
if (user != null) {
List<GrantedAuthority> authorityList = user.getRoles().stream()
.map(role -> new SimpleGrantedAuthority(role.getRole()))
.collect(Collectors.toList());
return new org.springframework.security.core.userdetails.User(username, user.getPassword(), user.isEnabled(), true, true, true, authorityList);
}
return null;
}
}
问题是,伙计们,我说我希望每个用户都有一个管理员角色,但我仍然可以用一个只有用户角色的用户登录。我不明白为什么
我已经进行了调试,我的用户成功地从数据库中获取,一切正常,但我不知道Spring在哪里检查角色
关于,请从配置中删除您的
.anyRequest().authenticated()
,因为如果您请求角色检查用户必须经过身份验证,则在通过安全筛选器检查时,它显然具有优先权,如user3030447在评论中所述:
角色必须以角色\开头
e、 g.如果您想使用hasRole('EDIT')
您必须创建如下授权:
new SimpleGrantedAuthority("ROLE_EDIT");
您可以使用
hasAuthority()
或hasAnyAuthority()
函数。启用调试日志记录(log4j.logger.org.springframework.security=debug,stdout,fileout-for log4j),它会告诉您很多。请将ROLE\u ADMIN
更改为ADMIN
,然后重试。@Mithun访问函数不需要“ROLE\uj”。请参阅@Evgeni-感谢您的更正。我还必须将角色添加到从数据库获得的角色中,但现在它可以工作了。如果我让你说的话,那么我可以在任何地方对每个角色进行身份验证,这样你就对了,谢谢。
@Service
public class MyUserDetailsService implements UserDetailsService {
@Autowired
private UsersService usersService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = usersService.getUser(username);
if (user != null) {
List<GrantedAuthority> authorityList = user.getRoles().stream()
.map(role -> new SimpleGrantedAuthority(role.getRole()))
.collect(Collectors.toList());
return new org.springframework.security.core.userdetails.User(username, user.getPassword(), user.isEnabled(), true, true, true, authorityList);
}
return null;
}
}
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private static final Logger LOGGER = LoggerFactory.getLogger(WebSecurityConfig.class);
@Autowired
private MyUserDetailsService userDetailsService;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/resources/**").permitAll()
.anyRequest().authenticated()
.antMatchers("/**").access("hasRole('ROLE_ADMIN')")
.and().formLogin()
.loginPage("/login")
.permitAll().and()
.logout().permitAll();
http.csrf().disable();
}
}
new SimpleGrantedAuthority("ROLE_EDIT");