如何告诉Spring Security我的服务类自动具有;角色“管理”;可以访问安全的方法吗?
我用Java和SpringMVC构建了一个使用SpringSecurity的web应用程序 我的服务方法被安全性锁定,类似这样的东西如何告诉Spring Security我的服务类自动具有;角色“管理”;可以访问安全的方法吗?,spring,spring-security,Spring,Spring Security,我用Java和SpringMVC构建了一个使用SpringSecurity的web应用程序 我的服务方法被安全性锁定,类似这样的东西 public interface UserService { @PreAuthorize("hasRole('ROLE_ADMIN')") public Integer createUser(String username, String password) throws Exception; } public interface
public interface UserService {
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Integer createUser(String username, String password) throws Exception;
}
public interface ConfigurationService {
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Integer createConfiguration(ConfigurationDTO configurationDTO) throws Exception;
}
一切都很好。除非用户以“ROLE_ADMIN”用户身份登录,否则无法访问此功能
然而。。。第一次启动应用程序时(在任何用户登录之前),我希望应用程序使用默认用户和默认配置进行设置
我有一个类似这样的服务在启动时运行
public class MainAppService {
public void initialize() throws Exception {
// if first time app is run then set things up
userService.createUser("admin", "defaultpassword");
configurationService.createConfiguration(myDefaultConfigutation);
// and so on ...
}
}
问题是,对“createUser”和“createConfiguration”的调用失败,并出现“拒绝访问”错误,因为没有用户登录
有没有办法告诉Spring Security,我的MainAppService类自动具有“ROLE\u ADMIN”并可以访问所有这些安全方法?用我的“变通”解决方案回答我自己的问题 我将“create”的实现移动到一个新的“private commonCreate”。然后我让安全保护的“create”调用新的“commonCreate”。我添加了一个新的不受安全保护的“internalCreate”,它也叫commonCreate 因此,我的WebController方法继续使用受安全保护的“create”,而我的内部服务使用“internalCreate” 这起作用了。但是如果有人有更干净的解决方案,请告诉我 例如
public interface UserService {
@PreAuthorize("hasRole('ROLE_ADMIN')")
public Integer createUser(String username, String password) throws Exception;
public Integer internalCreateUser(String username, String password) throws Exception;
}
public class UserServiceImpl implements UserService {
// is protected by Spring Security
public Integer createUser(String username, String password) throws Exception {
return commonCreateUser(username, password);
// is not protected by Spring Security
public Integer internalCreateUser(String username, String password) throws Exception {
return commonCreateUser(username, password);
}
private Integer commonCreateUser(String username, String password) throws Exception {
/* do the creation of the user */
}
}
public class MainAppService {
@Autowired
private UserService userService;
public void initialize() throws Exception {
// if first time app is run then set things up
// bypassing Spring Security
userService.internalCreateUser("admin", "defaultpassword");
// and so on ...
}
}
如果有人有更好的解决方案,请发布答案