nutzdao_realm = net.wendal.nutzbook.shiro.realm.NutDaoRealm
nutzdao_realm.credentialsMatcher = $sha256Matcher
shiro.ini中应该是没有nutzdao_realm这个属性的,那么这个自定义的属性是怎么被加载并处理的呢
nutzdao_realm = net.wendal.nutzbook.shiro.realm.NutDaoRealm
nutzdao_realm.credentialsMatcher = $sha256Matcher
shiro.ini中应该是没有nutzdao_realm这个属性的,那么这个自定义的属性是怎么被加载并处理的呢
额, 你说的原理? 还是说怎么跟其他类关联起来??
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;
}