2021SC@SDUSC
JdbcRealm的类继承关系图
JdbcRealm:
允许通过 JDBC 调用进行身份验证和授权的领域。 默认查询建议一种潜在的模式,用于检索用户的密码以进行身份验证,以及查询用户的角色和权限。 可以通过设置领域的查询属性来覆盖默认查询。
如果身份验证和授权的默认实现无法处理您的架构,则可以对此类进行子类化并覆盖适当的方法。 (通常是doGetAuthenticationInfo(AuthenticationToken) 、 getRoleNamesForUser(Connection, String)和/或getPermissions(Connection, String, Collection)
该领域通过继承AuthorizingRealm来支持缓存。
默认查询语句:
变量名 | sql语句 | 含义 |
---|---|---|
DEFAULT_AUTHENTICATION_QUERY | select password from users where username = ? | 用于检索用户帐户数据的默认查询 |
DEFAULT_SALTED_AUTHENTICATION_QUERY | select password, password_salt from users where username = ? | 当saltStyle为 COLUMN 时,用于检索用户帐户数据的默认查询。 |
DEFAULT_USER_ROLES_QUERY | select role_name from user_roles where username = ? | 用于检索适用于用户的角色的默认查询 |
DEFAULT_PERMISSIONS_QUERY | select permission from roles_permissions where role_name = ? | 用于检索适用于特定角色的权限的默认查询 |
密码哈希盐配置
枚举值 | 含义 |
---|---|
NO_SALT | 密码哈希不加盐 |
CRYPT | 密码哈希以 unix crypt 格式存储 |
COLUMN | 盐在数据库中的一个单独的列中 |
EXTERNAL | 盐不存储在数据库中。 将调用getSaltForUser(String)以获取盐 |
setDataSource:
//设置应用于检索此领域使用的连接的数据源。
//参数:
//dataSource – SQL 数据源
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
setAuthenticationQuery
/*
覆盖用于在身份验证期间检索用户密码的默认查询。 使用默认实现时,此查询必须将用户的用户名作为
单个参数,并以用户的密码作为第一列返回单个结果。 如果您需要与此查询结构不匹配的解决方案,您
可以覆盖doGetAuthenticationInfo(AuthenticationToken)或只是getPasswordForUser(Connection,
String)
参数:
authenticationQuery – 用于身份验证的查询
*/
public void setUserRolesQuery(String userRolesQuery) {
this.userRolesQuery = userRolesQuery;
}
setPermissionsQuery
/*
覆盖用于在授权期间检索用户权限的默认查询。 使用默认实现时,此查询必须将角色名称作为单个参
数,并为每个权限返回一行,其中包含单个列,包含权限。 如果您需要与此查询结构不匹配的解决方
案,您可以覆盖doGetAuthorizationInfo(PrincipalCollection)或只覆盖
getPermissions(Connection, String, Collection)
仅当您将permissionsLookupEnabled设置为 true 时,才会检索permissionsLookupEnabled 。 否
则,此查询将被忽略。
参数:
permissionQuery – 用于检索角色权限的查询
*/
public void setPermissionsQuery(String permissionsQuery) {
this.permissionsQuery = permissionsQuery;
}
setPermissionsLookupEnabled
/*
在授权期间启用权限查找。 默认值为“false” - 意味着只有角色与用户相关联。 将此设置为 true 以
查找角色和权限。
参数:
permissionLookupEnabled : 如果在授权期间应查找权限,则为 true;
如果应仅查找角色,则为 false。
*/
public void setPermissionsLookupEnabled(boolean permissionsLookupEnabled) {
this.permissionsLookupEnabled = permissionsLookupEnabled;
}
setSaltStyle
/*
设置盐样式。 参见saltStyle 。
参数:
saltStyle – 要设置的新 SaltStyle
*/
public void setSaltStyle(SaltStyle saltStyle) {
this.saltStyle = saltStyle;
if (saltStyle == SaltStyle.COLUMN && authenticationQuery.equals(DEFAULT_AUTHENTICATION_QUERY)) {
authenticationQuery = DEFAULT_SALTED_AUTHENTICATION_QUERY;
}
}
setSaltIsBase64Encoded
/*
可以关闭密码盐的 base64 编码。 默认值为 true,即。 期望来自数据库中字符串值的盐是 base64
编码的。
参数:
saltIsBase64Encoded – 要设置的 saltIsBase64Encoded
*/
public void setSaltIsBase64Encoded(boolean saltIsBase64Encoded) {
this.saltIsBase64Encoded = saltIsBase64Encoded;
}
/*
接口的这个实现期望主体集合返回一个字符串用户名,该用户名以该领域的name
参数:
principals – 应检索的 AuthorizationInfo 的主要标识主体。
返回:
与此主体关联的 AuthorizationInfo
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//null usernames are invalid
if (principals == null) {
throw new AuthorizationException("PrincipalCollection method argument cannot be null.");
}
String username = (String) getAvailablePrincipal(principals);
Connection conn = null;
Set<String> roleNames = null;
Set<String> permissions = null;
try {
conn = dataSource.getConnection();
// Retrieve roles and permissions from database
roleNames = getRoleNamesForUser(conn, username);
if (permissionsLookupEnabled) {
permissions = getPermissions(conn, username, roleNames);
}
} catch (SQLException e) {
final String message = "There was a SQL error while authorizing user [" + username + "]";
if (log.isErrorEnabled()) {
log.error(message, e);
}
// Rethrow any SQL errors as an authorization exception
throw new AuthorizationException(message, e);
} finally {
JdbcUtils.closeConnection(conn);
}
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roleNames);
info.setStringPermissions(permissions);
return info;
}