当前位置: 首页 > 知识库问答 >
问题:

这个loginmodule怎么了?以及如何在Jboss EAP6.1中使用JAAS对用户进行身份验证?

连志义
2023-03-14

我试图用JAAS在Java EE应用程序中实现一个身份验证/授权模块,只用于检查用户名和密码。我正在使用Jboss EAP6.1进行部署。但是在我的WebApp的所有页面中使用LoginModule后,我得到了403(访问被拒绝)。我的LoginModule是硬编码来检查“user123”和“pass123”,并为我的用户设置一个“admin”角色。

import javax.security.auth.Subject;
import javax.security.auth.callback.*;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
import java.io.IOException;
import java.security.Principal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class LoginMod implements LoginModule {

private CallbackHandler handler;
private Subject subject;
private UserPrincipal userPrincipal;
private RolePrincipal rolePrincipal;
private String login;
private List<Principal> userGroups;
private boolean succeeded = false;

@Override
public void initialize(
        Subject subject,
        CallbackHandler callbackHandler,
        Map<String, ?> sharedState,
        Map<String, ?> options)
{

    handler = callbackHandler;
    this.subject = subject;
}

@Override
public boolean login() throws LoginException
{
    Callback[] callbacks = new Callback[2];
    callbacks[0] = new NameCallback("login");
    callbacks[1] = new PasswordCallback("password", true);

    try {
        handler.handle(callbacks);
        String name = ((NameCallback) callbacks[0]).getName();
        String password = String.valueOf(((PasswordCallback) callbacks[1])
                .getPassword());

        if (name != null &&
                name.equals("user123") &&
                password != null &&
                password.equals("pass123")) {

            System.out.println("\t\t[LoginMod] login:"+name);
            login = name;
            userGroups = new ArrayList<Principal>();
            userGroups.add(new RolePrincipal("admin"));
            succeeded = true;
            return true;
        }
        throw new LoginException("Authentication failed");

    } catch (IOException e) {
        throw new LoginException(e.getMessage());
    } catch (UnsupportedCallbackException e) {
        throw new LoginException(e.getMessage());
    }

}

@Override
public boolean commit() throws LoginException
{
    if (succeeded == false) {
        return false;
    } else {
        userPrincipal = new UserPrincipal(login);
        subject.getPrincipals().add(userPrincipal);

        if (userGroups != null && userGroups.size() > 0) {
            for (Principal role : userGroups) {
                rolePrincipal = new RolePrincipal(role.getName());
                subject.getPrincipals().add(rolePrincipal);
            }
        }

        System.out.println("\t\t[LoginMod] subject contains the role:"+
                subject.getPrincipals().contains(rolePrincipal));
        return true;
    }
}

@Override
public boolean abort() throws LoginException
{
    System.out.println("\t\t[LoginMod] Aborted" );
    return false;
}

@Override
public boolean logout() throws LoginException
{
    subject.getPrincipals().remove(userPrincipal);
    subject.getPrincipals().remove(rolePrincipal);
    return true;
}
}

我创建了一个安全域,并在我的standalone.xml中为该模块添加了一个引用:

<security-domains>
 <security-domain name="acfwebRealm" cache-type="default">
   <authentication>
      <login-module code="acfweb.autenticacao.teste.LoginMod" flag="required"/>
   </authentication>
 </security-domain>
</security-domains>
 <?xml version='1.0' encoding='UTF-8'?>
   <jboss-web>
     <context-root>acfweb</context-root>
     <security-domain>acfwebRealm</security-domain>
   </jboss-web>
<welcome-file-list>
    <welcome-file>interfaces/pages/index.xhtml</welcome-file>
</welcome-file-list>
<security-constraint>
    <web-resource-collection>
        <web-resource-name>Usuarios Autenticados</web-resource-name>
        <url-pattern>/interfaces/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>

<security-role>
    <role-name>admin</role-name>
</security-role>

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>acfwebRealm</realm-name>
    <form-login-config>
        <form-login-page>/logar.xhtml</form-login-page>
        <form-error-page>/logar.xhtml</form-error-page>
    </form-login-config>
</login-config>
 <form method="post" action="j_security_check">
    <h:panelGrid columns="2">
        <h:outputLabel value="Username: " />
        <input type="text" id="j_username" name="j_username" />
        <h:outputLabel value="Password: " />
        <input type="password" id="j_password" name="j_password" />
        <h:outputText value="" />
        <h:panelGrid columns="1">
            <input type="submit" name="submit" value="Login" />
        </h:panelGrid>
    </h:panelGrid>
    <br />
</form>
INFO [stdout](http-/127.0.0.1:8080-2) [LoginMod] login:user123
INFO [stdout](http-/127.0.0.1:8080-2) [LoginMod] subject contains the role true

然后,对于之后的所有页面,我得到403(访问被拒绝)。

实际上,我不需要在数据库或外部LDAP中对我的用户进行身份验证,因为我有另一个服务可用于此。也许我不需要使用JAAS的完整安全模块,但我需要在EJB中通过角色控制我的用户,而不需要在从托管bean到EJB的每次调用中发送代表我的用户的数据,这些数据由Servlet过滤器捕获。例如,任何人都可以帮助我?我在这个loginmodule中做错了什么?对于所描述的需求,我有什么选择?

共有1个答案

张锐藻
2023-03-14

尝试更改jboss-web.xml

<jboss-web>  
    <security-domain>java:/jaas/acfwebRealm</security-domain>
</jboss-web>
 类似资料:
  • 我已经将我的Kafka jaas配置设置为Spring引导应用程序中的外部bean,以便从application.yaml文件中读取我的配置。 但是,从yaml文件读取jaas密钥表文件时,我遇到了一个错误。 面临错误 这就是我配置jaas的方式 KafkaJaasConfigurationProperty.java 应用yml 配置Bean.java 任何帮助将不胜感激。谢谢!

  • 问题内容: 我有以下情况: 服务器:码头(已配置JAAS) 客户端:Jersey通过JUnit调用(通过Maven) 我在Web服务器中设置了JAAS。我正在使用客户端部分作为测试。 在服务器端,用户通过具有JAAS处理的基本身份验证的表单进行身份验证。显然,用户必须先经过身份验证才能查看某些页面。 我希望能够在尝试访问安全页面之前通过泽西岛登录。如何才能做到这一点?我已经检查过您可以定义一个过滤

  • null 我研究了OAuth2隐式授权,但它要求用户在成功验证后批准/拒绝应用程序。它在我的情况下不起作用,因为我同时拥有应用程序和API。 我查看了OAuth2密码授权,它并不完美,因为我需要公开client_id/client_secret。 我关注OAuth2的原因是因为该API最终将是公开的。 忘记OAuth2,在用户发布用户名/密码时手动生成access_token(在本例中,当API公

  • 问题内容: 解析服务器提供OAuth身份验证。如何使用Parse Server的预定义OAuth模块(例如Facebook)来注册新用户或登录“ _User”类的现有用户? Parse Server 文档提供了有关如何配置OAuth模块的示例。但是,如何在iOS项目中使用它来登录或注册用户? 问题答案: 1,创建一个从NSObject和PFUserAuthenticationDelegate扩展的

  • 我开发了夸库斯应用程序。我正在尝试通过LDAP服务器对Rest调用的endpoint进行身份验证。要求是,如果用户想要访问endpoint之前,它通过Active Directory对用户所属的组织进行身份验证。如果他属于并获得成功,那么它应该为用户授权。 有谁能帮上忙吗?Quarkus在Java的应用如何进行认证。 我已经介绍了https://quarkus.io/guides/security

  • 我有以下情况: 我有一个使用 JMX 公开一些方法的应用程序,位于服务器上。目前,用户可以使用jconsole通过命令行连接到此内容。目前没有访问限制。 用户将登录到机器并以活动目录的形式存储访问权限。 我希望将身份验证和授权添加到 jmx 流程中,以便当用户在命令行中键入时: 它将检查他们的AD用户组,并确定他们是否有权读取或读写托管资源。 我有一个检索AD组的解决方案,但不是如何将其传递给JM