Java EE 中使用枚举的用户身份验证

User authentication in Java EE with enum

我正在考虑使用 Java 没有任何框架的 EE(例如 Spring),如果可能的话,执行用户身份验证。我在我的项目中使用 PG、JPA、JSF、Java EE、Glassfish 和 EJB。

在 Glassfish 中 web.xml 会为我做这件事。问题是,我发现有很多可能性可以用 3 tables - USER、USER_IN_GROUP 和 GROUP,以及 none 来做它具有 enum 角色和 1 个 table - USER(角色作为列),这应该更容易和更轻便。

角色枚举如:

public enum Role {
   User, Admin;
}

用户实体如:

public class User implements Serializable {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   private String nick;
   private String pass;

   @Enumerated(EnumType.STRING)
   private Role roles;

   //Getters and Setters
}

web.xml中,我使用基本方法来测试凭据。

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>issuetrack-realm</realm-name>
</login-config>
<security-role>
    <description/>
    <role-name>User</role-name>
</security-role>
<security-role>
    <description/>
    <role-name>Admin</role-name>
</security-role>

使用 JDBCRealm 的领域如下所示: Realm in Glassfish

在我尝试登录后它说:警告:WEB9102:Web 登录失败:com.sun.enterprise.security.auth.login.common.LoginException:登录失败:安全异常

有什么建议吗?


登录失败:安全异常只是领域设置的问题。我没有在 db 中保护我的密码,我将摘要算法留空 = SHA-256。

真正的问题在于那里的角色。我无法使用此设置进入我的应用程序,因为有一个昵称主体而不是组名称(db 的 REALM 设置)。

实际上,您应该对您的领域设置进行微小的更改就可以了

尝试为

设置值
Group Table User Name Column: roles
Digest Algorithm: none

同样在您的问题中,您没有提供将您的组(您称之为角色)映射到角色的方式。为简单起见,组是您数据库中的内容,角色是您在 WEB 应用程序中定义的内容。这应该在应用程序服务器特定的描述符中完成。在您的情况下,假设您使用最新的 GF 版本,它是 glassfish-web.xml 并且因为您对组和角色使用相同的名称,所以它应该类似于以下内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN"
        "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app>

.............

    <security-role-mapping>
        <role-name>Admin</role-name>
        <principal-name>Admin</principal-name>
        <group-name>Admin</group-name>
    </security-role-mapping>

    <security-role-mapping>
        <role-name>User</role-name>
        <principal-name>User</principal-name>
        <group-name>User</group-name>
    </security-role-mapping>

..............
</glassfish-web-app>

但是,在以这种方式实现安全性之前,我会三思而后行。您的用户可能拥有唯一的角色,并且您失去了框架为您提供的相当多的灵活性。您可能需要考虑用户的角色列表,在这种情况下可以使用 @CollectionTable 注释。尽管如此,您想要实现的目标绝对是可能的,并且它与 GF 完美配合。

我建议您考虑将所有用户管理需求委托给 Stormpath。使用 Stormpath,您无需担心此类低级问题,您的所有数据都得到安全管理和存储。 Stormpath 提供:

  • 使用不同 SDK 的用户管理 API:node.js、express、java、rest、python、flask。
  • 现成的托管登录:登录、注册和密码重置。
  • 现成的 ID 站点支持跨应用程序的单点登录
  • API 用户密钥,使用 HTTP 基本身份验证或 OAuth2
  • 保护
  • 社交登录:Facebook,Google,LinkedIn,Github
  • 与 Shiro 和 Spring 安全集成
  • 与 Active Directory 和 LDAP 集成

使用 Stormpath,您只需创建 Groups which will represent your roles. Inside your groups and accounts, you can also create finer-grained concepts like permissions using our flexible Custom Data 个概念。

免责声明,我是一名活跃的 Stormpath 贡献者。