【问题标题】:EJB 3.1 authentication on lock up锁定时的 EJB 3.1 身份验证
【发布时间】:2015-05-10 16:08:36
【问题描述】:

我有一个无状态 bean,我希望只允许名为 "TestUser"

的用户访问

我已经设置了如下所示的注释:

@Stateless
@DeclareRoles("TestUser")
public class LibraryBean implements LibraryIFace {

    @Override
    public void setName(String name){
        sb.setName( name );
    }

    @Override
    public String getName(){
        return sb.getName();
    }

    @EJB
    private SingIFace sb;
}

servlet 锁定 bean 并返回名称。

我希望 servlet 必须以 TestUser 身份登录,然后才能从 bean 获取名称。 调用 servlet 的真实用户不必看到任何消息框或插入用户/密码。

这可能吗?

更新 我的意思是我需要 EJB 将检查连接以允许拒绝用户/psw 对的基础,或类似的东西。

【问题讨论】:

    标签: java jakarta-ee servlets jboss ejb


    【解决方案1】:

    您可以使用拦截器来完成工作,这比在 bean 调用中检查角色要干净得多。

    你的@interface 可能是这样的:

    @InterceptorBinding
    @Target({METHOD, TYPE})
    @Retention(RUNTIME)
    public @interface Secure {
       @NonBinding String[] rolesAllowed() default {};
    }
    

    然后设置并在您使用 @Secure 注释方法时调用建议,该方法检查 HttpSession 是否有所需的角色,如果找不到所需的角色,则返回登录页面。

    1.- 注册拦截器

    <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
    http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
    
    <interceptors>
            <class>full_class_name_here</class>
        </interceptors>    
    

    2.- 实现拦截器

    @Secure
    @Interceptor
    public class SecurityInterceptor implements Serializable{
    
    /**
     * 
     */
    private static final long serialVersionUID = 66355064016557358L;
    
    @AroundInvoke
    public Object checkInvocation(InvocationContext joinPoint) throws Exception {
    

    更新:最后,你应该从你的拦截器访问 HTTP 会话,这有点麻烦,可以在这里描述: Is there a way to access HttpSession from EJB module?

    【讨论】:

    • 感谢您的回复,我对您的代码有 2 个问题。我必须将它实现到bean所在的项目中,对吗?客户端必须做什么才能通过身份验证?
    • 1.- 至少,拦截器应该“看到”@interface 的声明 2.- 处理登录过程的控制器应该将用户的角色放在 HTTP 会话中,以便它可以稍后在 EJB 中检查
    • 有一种方法可以确定谁调用了 EJB?我需要只有我的模块必须能够访问我的 EJB 并拒绝所有其他连接。
    • 这里的问题是您混合了安全问题。如果 HTTP 接口中的用户(您应该为其使用 HTTP 会话)和在容器中部署 EJB 的用户(您应该为其使用容器安全性(使用 @RolesAllowed 等...)
    • 好的,那么允许 EJB 检查谁可以访问服务的正确方法是什么?我需要一种方法来阻止不受信任的连接。
    猜你喜欢
    • 2014-05-29
    • 2010-12-07
    • 2016-07-14
    • 2012-06-16
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多