NutzCN Logo
问答 shiro.ini中应该是没有nutzdao_realm这个属性的,那么这个自定义的属性是怎么被加载并处理的呢
发布于 3328天前 作者 qq_6d1ec279 2795 次浏览 复制 上一个帖子 下一个帖子
标签: shiro

nutzdao_realm = net.wendal.nutzbook.shiro.realm.NutDaoRealm
nutzdao_realm.credentialsMatcher = $sha256Matcher

shiro.ini中应该是没有nutzdao_realm这个属性的,那么这个自定义的属性是怎么被加载并处理的呢

7 回复

额, 你说的原理? 还是说怎么跟其他类关联起来??

NutDaoRealm的构造方法里面会关联一种Token类(里面的setAuthenticationTokenClass), 而这种Token就是CaptchaFormAuthenticationFilter中的executeLogin方法中使用到Token类型, 隐式关联起来了.

在shiro.ini里面是不能直接看出这种关联关系的

不是说怎么跟其他类关联起来,我的意思是shiro框架怎么知道要去加载并初始化net.wendal.nutzbook.shiro.realm.NutDaoRealm 这个类作为他的realm呢,
毕竟这是一个自定义属性不是shiro体系内的

说一下Shiro的基本调用过程(我的理解, ^_^)

核心配置:

[main]
nutzdao_realm = net.wendal.nutzbook.shiro.realm.NutDaoRealm
authc = org.nutz.integration.shiro.CaptchaFormAuthenticationFilter
authc.loginUrl = /user/login
logout.redirectUrl= /user/login
[urls]
/user/logout = logout
/user/** = authc
首先, 登陆必须是特定URL(这里是/user/login),且必须POST请求,这是AuthenticationFilter里判断是否为登陆请求的默认方式
过程如下:
1. 首先, 浏览器发起一个POST请求到/user/login
2. web.xml里面的ShiroFilter拦截到这个请求
3. Shiro根据[urls]和[main]里面的配置,知道这个请求要交给CaptchaFormAuthenticationFilter处理
4. CaptchaFormAuthenticationFilter判断该请求是POST,所以,调用executeLogin
5. executeLogin中判断各种小条件,然后生成CaptchaUsernamePasswordToken
6. 而这个CaptchaUsernamePasswordToken正是nutzdao_realm对于的net.wendal.nutzbook.shiro.realm.NutDaoRealm实例的构造方法中声明的类型, 这里说一下, shiro会把shiro.ini里面的realm实例存为List, 在配置文件中是不能直接看出Realm和Token类型的关系的
7. 然后shiro就调用NutDaoRealm的doGetAuthenticationInfo获取登陆信息了,然后判断hash后的密码进行判断登陆
8. 完成后再回到CaptchaFormAuthenticationFilter, 执行onSucess或者onFail之类的操作,完成登陆

刚看了一下你之前的回复

** 里说一下, shiro会把shiro.ini里面的realm实例存为List, 在配置文件中是不能直接看出Realm和Token类型的关系的**

是不是shiro会把属性名为realm结尾的属性值就认为是realm类的全路径啊

这得翻翻shiro的源码了
自豪地采用 NutzCN ionic

根据类型判断不就行了,何必根据变量名
自豪地采用 NutzCN ionic

哦也是,多谢

代码找出来了, 类名org.apache.shiro.config.IniSecurityManagerFactory

    @SuppressWarnings({"unchecked"})
    private SecurityManager createSecurityManager(Ini ini, Ini.Section mainSection) {

        Map<String, ?> defaults = createDefaults(ini, mainSection);
        Map<String, ?> objects = buildInstances(mainSection, defaults);

        SecurityManager securityManager = getSecurityManagerBean();

        boolean autoApplyRealms = isAutoApplyRealms(securityManager); // 当没有主动设置的时候为true

        if (autoApplyRealms) {
            //realms and realm factory might have been created - pull them out first so we can
            //initialize the securityManager:
            Collection<Realm> realms = getRealms(objects); // 这里面就有 if (value instanceof Realm)的判断
            //set them on the SecurityManager
            if (!CollectionUtils.isEmpty(realms)) {
                applyRealmsToSecurityManager(realms, securityManager);
            }
        }

        return securityManager;
    }
添加回复
请先登陆
回到顶部