如何将Spring安全登录传播到EJB?

tan*_*ens 6 authentication jboss ejb spring-security

上下文

我有一个在JBoss 4.2.3应用服务器上运行的J2EE应用程序.可以通过Web界面访问该应用程序.身份验证通过基本身份验证完成.在EJB内部,我询问bean的安全上下文中的主体(登录用户的名称),并在允许此用户访问EJB的此方法时进行一些授权检查.EJB处于与处理Web前端的servlet不同的生活中,因此我无法直接访问spring应用程序上下文.

要求改变

我想切换到Spring Security来处理用户登录.

如何将spring登录信息传播到JBoss安全上下文,这样我仍然可以使用我的EJB而不必重写它们?


想法和链接

我已经找到了页谈论"使用Spring Security到EJB层传播身份",但可惜的是它指的是一个旧版本的Spring Security(Acegi的)和我不熟悉不够使用Spring Security,使这项工作与实际版本(3.0.2).

是使用WebLogic看起来类似的东西.

Yur*_*kin 1

如果您正确配置了 spring-security(过滤器链中的过滤器,security-context.xml),您可以使用注释 @Secured 来限制具有所需用户角色的用户。您可以在类级别或/和方法级别使用此注释。

如果你需要知道当前用户的所有授权信息,你可以使用这个助手(我为我的web应用程序编写了这个,但它可能对其他应用程序有用。MyUserDetails是一个服务bean,spring-security的UserDetail后代。):

public class LoginHelper {

    /**
     * @return user object if user is authenticated and null if is not
     */
    public static User getUser() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

        if (authentication != null) {
            Object principal = authentication.getPrincipal();
            if (principal instanceof MyUserDetails) {
                return ((MyUserDetails) principal).getUser();
            }
        }
        return null;
    }

    /**
     * Check for authenticated user
     *
     * @return true if user is authenticated and false if is not
     */
    public static boolean isAuthenticated() {
        final User user = getUser();
        return user != null;
    }

}
Run Code Online (Sandbox Code Playgroud)