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 贡献者。
我正在考虑使用 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 贡献者。