【问题标题】:User authentication in Java EE with enumJava EE 中使用枚举的用户身份验证
【发布时间】:2015-06-09 10:53:44
【问题描述】:

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

在 Glassfish 中 web.xml 会为我做这件事。问题是,我发现使用 3 个表 - USER、USER_IN_GROUP 和 GROUP 有很多可能性,而没有使用 枚举角色和只有 1 个表 - 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 我使用 Basic 方法来测试凭据。

<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 设置)。

【问题讨论】:

  • 你的问题似乎与这个重复:stackoverflow.com/questions/7941713/…
  • 不不,我看到了这个,如果是一样的我就不会写了。我的问题是领域,那个问题的密码有问题。
  • 您的想法的问题在于,用户和角色/组之间存在固有的多对多关系,无法使用单个表轻松建模。您的模型将每个用户限制为一个角色。您可以这样做,但您必须实现和安装自己的登录模块,而不是使用服务器内置的登录模块。
  • @SteveC 我想必须有一些简单的解决方案。我知道业务逻辑通常不是由一个角色完成的,但它是最简单的解决方案,因此我会理解它,因为至少应该有同样简单的解决方案。

标签: jakarta-ee jpa enums glassfish


【解决方案1】:

实际上你应该对你的领域设置进行微小的更改

尝试设置值

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 完美配合。

【讨论】:

  • 哇,非常感谢!我在这个项目上学习,但我会考虑它。只要我有机会投票给你,我就会!
【解决方案2】:

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

  • 具有不同 SDK 的用户管理 API:node.js、express、java、rest、python、flask。
  • 现成的托管登录:登录、注册和密码重置。
  • 现成的 ID 站点支持跨应用程序的单点登录
  • 为您的用户提供 API 密钥,使用 HTTP Basic Auth 或 OAuth2 进行保护
  • 社交登录:Facebook、谷歌、LinkedIn、Github
  • 与 Shiro 和 Spring Security 集成
  • 与 Active Directory 和 LDAP 集成

使用 Stormpath,您只需创建代表您的 rolesGroups。在您的群组和帐户中,您还可以使用我们灵活的 Custom Data 概念创建更细粒度的概念,例如 permissions

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

【讨论】:

  • 嘿马里奥,谢谢你的回答。看起来不错,但这是我要学习的项目,我需要在 GF 中完成,而不是使用其他框架。无论如何,我稍后会看看这个。 :)
猜你喜欢
  • 2011-01-13
  • 2017-02-16
  • 1970-01-01
  • 2019-07-08
  • 2013-02-02
  • 2013-03-24
  • 2011-05-11
  • 2011-02-19
相关资源
最近更新 更多