在我目前的项目中,我们有一组服务类,这些服务类由基于方法的安全性保护。
现在在某些情况下,“系统”需要自己调用安全方法。 (例如:用户离开了一个频道,并且该频道被隐式关闭,因为它是空的。通常'close'受到保护。)
如何以安全和不安全的方式同时提供对服务类的访问?
编辑 - 简短示例
在审核期间,系统会检查这是否是对用户的主动禁令。
public User authenticate(String name, String token) throws BadCredentialsException, RuntimeException {
User user = get(name);
if (user == null || !user.getToken().equals(token)) {
throw new BadCredentialsException("Invalid Project/Username/Password");
}
Ban userBan = banService.getBanForUser(user);
if (userBan != null) {
throw new UserBannedException("User was baned", userBan);
}
return user
}
但是对任何禁令的访问都受到基于方法的安全性的保护,因此不是每个用户都可以“获取”它们。
@PreAuthorize("isAuthenticated()")
public Ban getBanForUser(User user) {
return ...
}
所以基本上我需要两种方法来访问这个方法。一个受spring-security inteceptor(对于“users”)保护而另一个不受(对于“system”)的保护。
这可能没有包装类,继承魔法,......
如果我能定义两个具有spring-security和一个whithout的同一类的spring bean,那将是很棒的。
答案 0 :(得分:1)
当你调用受保护的方法之前,解决方案(当然没有接近优雅的东西)将模拟超级用户的身份验证。像这样:
SecurityContextHolder.getContext().setAuthentication(privileged user here);
Ban userBan = banService.getBanForUser(user);
SecurityContextHolder.getContext().setAuthentication(null);