我正在使用 spring security 并有如下方法:
@PreAuthorize("hasRole('ADMIN')")
void createUser(..)
@PreAuthorize("hasRole('ADMIN')")
void createDepartment(..)
@PreAuthorize("hasRole('ADMIN')")
void createProject(..)
只有具有 ADMIN 角色的用户才可以执行这些方法。在该方法内,执行管理员(当前登录的用户)将作为创建者添加到新记录中。
问题: 第一次启动应用程序时,当数据库为空时,我想创建默认用户/部门/项目。
private void init() {
createUser("admin", "admin");
createProject("defaultProject");
..
}
我考虑让一些具有管理员角色的系统用户应该执行 init()。 我如何才能以编程方式登录为该系统用户以执行 init()?
谢谢!
PS:跳过 @PreAuthorize 检查是不够的,因为我需要在这些方法中登录用户。
最佳答案
您可以在init
之前将具有正确角色的自定义Authentication
设置为SecurityContextHolder
。类似的东西
protected void setSecurityContext() {
SecurityContext securityContext = new SecurityContextImpl();
User user = new User("userName", null, null);
Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
grantedAuthorities.add(new SimpleGrantedAuthority("ADMIN"));
AnonymousAuthenticationToken anonymousAuthenticationToken = new AnonymousAuthenticationToken("test", user, grantedAuthorities);
securityContext.setAuthentication(anonymousAuthenticationToken);
SecurityContextHolder.setContext(securityContext);
// init method
//...
// don't forget to clear context
SecurityContextHolder.clearContext();
}
关于spring - 在数据库初始化期间以编程方式登录Spring Security,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41706280/