2012-05-31 51 views
0

在我当前的项目中,我们有一组服务类,它们受基于方法的安全性的保护。我如何创建方法安全保护的DAO的安全和不安全版本

现在在某些情况下,“系统”需要自行调用安全方法。 (例如:一个用户离开一个频道,并且该频道由于其空闲而被隐式关闭,通常'关闭'被保护)。

如何以安全和不安全的方式同时访问服务类?

编辑 - 短示例

auhentication期间,系统检查是否在这里是相对于用户的有源禁令。

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保护(对于“用户”),另一个不是(对于“系统”)。

这可能没有包装类,继承魔术,...

这将是巨大的,如果我可以定义具有相同的类一个带弹簧的安全性和一个内部消除两个弹簧豆。

+0

您可以根据角色的基础上保护方法,如果ROLE_SUPER然后给访问'接近()'方法,或者如果其他角色再保护,同时提供更多的细节,以便我们可以帮助你。 –

+0

@Nandkumar我添加了一个简短的例子。 – Laures

回答

1

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

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

目前我做类似的事情,但我保留原来的上下文,所以我可以在通话后恢复它。 – Laures