我想为一些休息服务配置Spring启动和弹簧安全性。 我有表User,priviledge,priviledge_user 我有这个配置文件
WebSecurityConfig
@EnableWebSecurity
@Configuration
class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().fullyAuthenticated().and().
httpBasic().and().
csrf().disable();
}
}
和AuthenticationConfiguration
@Configuration
public class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter {
@Autowired
UserRepository userRepository;
Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService());
}
@Bean
UserDetailsService userDetailsService() {
return new UserDetailsService() {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User account = userRepository.findByUsername(username);
log.info("The user ({}) logged has the password {}", username, account.getPassword());
org.springframework.security.core.userdetails.User userSession = new org.springframework.security.core.userdetails.User(account.getUsername(), account.getPassword(), true, true, true, true,
AuthorityUtils.createAuthorityList("USER"));
return userSession;
}
};
}
}
验证代码似乎身份验证运行良好因为我有来自数据库的用户(我正在使用JNDI数据并且在application.properties中配置了这个) 但当我尝试在http://localhost:8080/上获取任何内容并设置我的凭据时,我无法访问并始终获得凭据提示 我做得怎么样?
答案 0 :(得分:0)
您没有使用正确的权限实例化UserDetails对象。
不应始终将“USER”传递给AuthorityUtils.createAuthorityList方法,而应该为要加载的用户在privilege_user表中传递包含所有角色/权限的List。默认情况下,此角色的格式为“ROLE_USER”,“ROLE_ADMIN”......
因此,成功从数据库加载用户并不意味着身份验证过程运行良好。您仍然必须告诉他如何为该用户加载权限。
答案 1 :(得分:0)
问题是,您正在使用带有@CreatedBy或@LastModifiedBy批注的DB审计,但是您试图在任何用户登录之前插入文档。这种情况发生在创建新用户或在目标网页控制器中创建操作。为了克服这个问题,如果输入参数正确,则在数据库中有一个系统用户,例如system@yourdomain.com,然后在相应的控制器中设置主体。
在这样做的同时,DBAuditor将获取带注释文件的系统用户ID。确保在执行此操作后,加载新创建的用户主体。