2021-12-26 shiro-core JdbcRealm源码分析(一)

JdbcRealm是Shiro框架中用于JDBC身份验证和授权的领域类。它支持通过设置查询属性来定制查询,包括用户密码、角色和权限。默认查询包括用户认证、角色和权限的获取。子类化JdbcRealm可以自定义认证和授权逻辑。此外,可通过设置盐样式、权限查找开关等来调整安全性。
摘要由CSDN通过智能技术生成

2021SC@SDUSC
JdbcRealm的类继承关系图
在这里插入图片描述
JdbcRealm:
允许通过 JDBC 调用进行身份验证和授权的领域。 默认查询建议一种潜在的模式,用于检索用户的密码以进行身份​​验证,以及查询用户的角色和权限。 可以通过设置领域的查询属性来覆盖默认查询。

如果身份验证和授权的默认实现无法处理您的架构,则可以对此类进行子类化并覆盖适当的方法。 (通常是doGetAuthenticationInfo(AuthenticationToken) 、 getRoleNamesForUser(Connection, String)和/或getPermissions(Connection, String, Collection)

该领域通过继承AuthorizingRealm来支持缓存。

默认查询语句:

变量名sql语句含义
DEFAULT_AUTHENTICATION_QUERYselect password from users where username = ?用于检索用户帐户数据的默认查询
DEFAULT_SALTED_AUTHENTICATION_QUERYselect password, password_salt from users where username = ?当saltStyle为 COLUMN 时,用于检索用户帐户数据的默认查询。
DEFAULT_USER_ROLES_QUERYselect role_name from user_roles where username = ?用于检索适用于用户的角色的默认查询
DEFAULT_PERMISSIONS_QUERYselect 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;

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值