二.五 配置shiro 文件
文件的名称是 applicationContext-shiro.xml ,在读取 spring配置文件时,也读取进来了。 不用单独配置。
web.xml 文件中:
<!-- 启动spring --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext-*.xml</param-value> </context-param>
二.五.一 配置密码加密验证
<!-- 凭证匹配器 --> <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"> <property name="hashAlgorithmName" value="md5"/> <property name="hashIterations" value="10"/> <property name="storedCredentialsHexEncoded" value="false"/> </bean>
与 以前的 shiro.ini 文件
#加密类 credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher #加密方式 credentialsMatcher.hashAlgorithmName=md5 #加密次数 credentialsMatcher.hashIterations=10 #存储散列后的密码是否为16进制 credentialsMatcher.storedCredentialsHexEncoded=false
是匹配的。
二.五.二 配置自定义realm, 注入密码匹配器
<!-- 配置自定义的ream --> <bean id="myRealm" class="com.yjl.shiro.MyRealm"> <!-- 配置密码管理 --> <property name="credentialsMatcher" ref="credentialsMatcher"></property> </bean>
与以前的
#配置自定义realm myRealm=com.yjl.shiro.MyRealm #配置加密 myRealm.credentialsMatcher=$credentialsMatcher
是匹配的。
二.五.三 配置 securityManager 对象,注入自定义Realm
<!-- 配置securityManager, 将一些信息注入到里面 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myRealm"></property> </bean>
与以前的:
#配置自定义realm myRealm=com.yjl.shiro.MyRealm #配置加密 myRealm.credentialsMatcher=$credentialsMatcher #注入自定义的realm securityManager.realm=$myRealm
是匹配的。
securityManager 不仅可以注入自定义Realm,还可以注入缓存,session管理,记住我等功能。
二.五.四 配置 生命周期
<!-- 保证实现了Shiro内部lifecycle函数的bean执行 --> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
与 web.xml 中 shiroFilter 部分的 targetFilterLifecycle 属性为 true 相对应。
二.五.五 配置 shiroFilter 过滤器
<!-- 配置shiroFilter 规则 ,与web.xml的过滤器中的 targetBeanName 名称保持一致--> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"></property> <!-- 配置登录,登录成功和没有权限的三个路径 ,以前的main 部分--> <property name="loginUrl" value="/User/toLogin"></property> <!-- <property name="successUrl" value="/Main/toMain"></property> --> <property name="unauthorizedUrl" value="/Privilege/noPrivilege"></property> <!-- 配置规则 ,即urls部分--> <property name="filterChainDefinitions"> <value> <!-- 配置拦截器 --> /static/**=anon /User/toLogin=anon /User/login=anon /User/logout=logout /Main/toMain=authc <!-- 没有配置的路径走认证 --> /**=authc </value> </property> </bean>
常用的,主要分为五个部分,下面依次讲解。
注意点: 该工厂 ShiroFilterFactoryBean 实例化bean 的 必须是 shiroFilter ,这个名称必须要与 web.xml中关于shiro配置的 filter-name 的名称相同。
二.五.五.一 注入 securityManager 对象
<property name="securityManager" ref="securityManager"></property>
二.五.五.二 配置 loginUrl 路径
<property name="loginUrl" value="/User/toLogin"></property>
loginUrl 指的是 ,如果用户没有认证,或者没有通过认证,跳转到哪?
一般跳转到去登录页面的那个方法。
与以前 [main] 里面的
#配置权限 authc.loginUrl=/User/toLogin
对应。
二.五.五.三 配置 successUrl 路径
一般不配置这一个路径。
这个路径指的是,如果员工认证通过,跳转到哪? 认证通过,会跳转到主页, 但跳转到主页,一般都是通过程序代码固化下来,并不在这儿进行配置。 这个路径的实际意义是, 如果认证通过,就跳转到上一次要访问的页面。
即,如果用户 admin 想访问 用户的界面, /项目名/User/toList, 当用户手动输入这个网址时,发现没有认证,就会跳转到登录的界面,当用户登录成功后, 这个时候,会跳转到哪呢? 并不会跳转到主页那,而是跳转到上一次想访问的那个页面, 即 /项目名/User/toList 页面, 展示用户的相应信息。 这个功能还是非常好的,所以一般不配置这个属性值。
二.五.五.四 配置 unauthorizedUrl 路径
<property name="unauthorizedUrl" value="/Privilege/noPrivilege"></property>
unauthorizedUrl 指的是权限不足时,跳转到哪?
与以前 [main] 部分的
#跳转到权限不足的路径 roles.unauthorizedUrl=/NoPermission/NoPermission perms.unauthorizedUrl=/NoPermission/NoPermission
相对应。
二.五.五.五 filterChainDefinitions 配置拦截器
<!-- 配置规则 ,即urls部分--> <property name="filterChainDefinitions"> <value> <!-- 配置拦截器 --> /static/**=anon /User/toLogin=anon /User/login=anon /User/logout=logout /Main/toMain=authc <!-- 没有配置的路径走认证 --> /**=authc </value> </property>
这个与以前的 [urls] 部分
[urls] #静态页面可以访问 /static/**=anon #跳转到登录页面和登录方法可以访问 /User/toLogin=anon /User/login=anon #跳转到主页,需要认证 /Main/toMain=authc /Privilege/getPrivilegeByUId=authc #执行方法,不仅需要认证,还需要有相应的方法 /Dept/add=authc,perms["dept:add"] /Dept/update=authc,perms["dept:update"] /Dept/list=authc,perms["dept:list"] /Dept/delete=authc,perms["dept:delete"] /User/toList=authc,perms["user:toList"] #退出登录 /User/logout=logout #其他的一切资源,都需要认证 /**=authc
相对应。
发现,并没有 /Dept/add,/Dept/list … 等权限的配置。
一个系统中,会有很多的权限,不能添加一个就在 filterChainDefinitions 部分配置一个,那么就太烦繁了, 一般都是通过 注解的方式进行配置权限。
关于注解方式配置权限,老蝴蝶下面会讲解。
二.五.六 applicationContext-shiro.xml 配置文件合并
将上面的这些部分,进行合并,得到一个总的配置信息。
<!-- 凭证匹配器 --> <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"> <property name="hashAlgorithmName" value="md5"/> <property name="hashIterations" value="10"/> <property name="storedCredentialsHexEncoded" value="false"/> </bean> <!-- 配置自定义的ream --> <bean id="myRealm" class="com.yjl.shiro.MyRealm"> <!-- 配置密码管理 --> <property name="credentialsMatcher" ref="credentialsMatcher"></property> </bean> <!-- 配置securityManager, 将一些信息注入到里面 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myRealm"></property> </bean> <!-- 保证实现了Shiro内部lifecycle函数的bean执行 --> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> <!-- 配置shiroFilter 规则 ,与web.xml的过滤器中的 targetBeanName 名称保持一致--> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"></property> <!-- 配置登录,登录成功和没有权限的三个路径 ,以前的main 部分--> <property name="loginUrl" value="/User/toLogin"></property> <!-- <property name="successUrl" value="/Main/toMain"></property> --> <property name="unauthorizedUrl" value="/Privilege/noPrivilege"></property> <!-- 配置规则 ,即urls部分--> <property name="filterChainDefinitions"> <value> <!-- 配置拦截器 --> /static/**=anon /User/toLogin=anon /User/login=anon /User/logout=logout /Main/toMain=authc <!-- 没有配置的路径走认证 --> /**=authc </value> </property> </bean>