如何创建方法安全保护DAO的安全版本和不安全版本

时间:2012-05-31 12:40:44

标签: java spring-security authorization

在我目前的项目中,我们有一组服务类,这些服务类由基于方法的安全性保护。

现在在某些情况下,“系统”需要自己调用安全方法。 (例如:用户离开了一个频道,并且该频道被隐式关闭,因为它是空的。通常'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,那将是很棒的。

1 个答案:

答案 0 :(得分:1)

当你调用受保护的方法之前,解决方案(当然没有接近优雅的东西)将模拟超级用户的身份验证。像这样:

SecurityContextHolder.getContext().setAuthentication(privileged user here);    
Ban userBan = banService.getBanForUser(user);
SecurityContextHolder.getContext().setAuthentication(null);