Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何告诉Spring Security我的服务类自动具有;角色“管理”;可以访问安全的方法吗?_Spring_Spring Security - Fatal编程技术网

如何告诉Spring Security我的服务类自动具有;角色“管理”;可以访问安全的方法吗?

如何告诉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

我用Java和SpringMVC构建了一个使用SpringSecurity的web应用程序

我的服务方法被安全性锁定,类似这样的东西

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 ...
   }
}
如果有人有更好的解决方案,请发布答案