SSM篇
Shiro的配置一般来说都是通过xml文件来实现的,当然也有SpringBoot通过配置类实现的,本节是传统的java项目通过配置文件实现。
各位把眼睛睁亮,开始了::
POM文件不多说 自己添加。
一.web.xml中的配置。
大家都知道web.xml是web程序的入口 。shiro在web.xml中的配置其实就是一个拦截器,将所有的路径都拦截,进入shiro的管理中进行处理。决定哪些放行,哪些拦截。详看代码:
<!--配置shiro过滤器 -->
<filter>
<!--shiro的名称一致 -->
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<!-- spring创建出来的filter 的生命周期交给servlet管理 -->
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
二.application-shiro.xml中的配置。
<!-- 1.shiro的组件以bean的形式 交给spring容器管理 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"></bean>
<!--2.为指定的目标创建代理对象 指定的目标就是shiro的bean -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
<!--默认使用cglib的代理对象
代理模式:1 jdk 2cglib
-->
<property name="proxyTargetClass" value="true"></property>
</bean>
<!--3.强制使用cglib代理模式
当生成切面的时候 代理对象都统统使用cglig代理
-->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
<!--4.配置realm Shiro是一个安全框架 可以为用户的校验和权限的校验 都是需要用户提供校验的规则和原料
这个类就是Realm
这个Realm是自己定义的
-->
<bean id="authRealm" class="cn.tarena.ht.shiro.AuthRealm">
<!--自定义的加密算法
name属性的名称是固定的不要修改
-->
<property name="CredentialsMatcher" ref="authEnctype"></property>
</bean>
<!--5.配置自定义加密器 -->
<bean id="authEnctype" class="cn.tarena.ht.shiro.AuthCredential"></bean>
<!--6.配置shiro的安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!--引入用户自动以的realm realm的名称 不能对随便修改 -->
<property name="realm" ref="authRealm"></property>
</bean>
<!--7.配置权限管理器-->
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<!--引入安全管理器 -->
<property name="securityManager" ref="securityManager"></property>
</bean>
<!--8.配置过滤器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!--注入安全管理器 -->
<property name="securityManager" ref="securityManager"></property>
<!--默认的登陆界面-->
<property name="loginUrl" value="/index.jsp"></property>
<!--过滤器链 -->
<property name="FilterChainDefinitions">
<value>
<!--anon 表示放行 authc拦截 -->
/tologin*=anon
/login*=anon
/staticfile/**=anon
<!--所有的访问都拦截 -->
/** = authc
</value>
</property>
</bean>
配置完了就是 自己写自定义的Realm和自定义的CredentialsMatcher
自定义的Realm要继承AuthorizingRealm
自定义的CredentialsMatcher要继承SimpleCredentailsMathce
上面继承的这两个不是说非要这两个,而是这两个类更加容易实现我们的业务,同样 90%也适用你。
SpringBoot篇
shiro用SpringBoot进行配置 ,其实就是将配置文件转换成了配置类而已,大家熟悉了xml的配置,配置类的方式也相当简单。
详细代码:
/**
* 1.将shiro生命周期交给Spring管理
*/
@Bean(name="lifecycleBeanPostProcessor")
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor(){
return new LifecycleBeanPostProcessor();
}
/**
* 2.为制定目标创建代理对象
*/
@Bean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator(){
DefaultAdvisorAutoProxyCreator creator=new DefaultAdvisorAutoProxyCreator();
creator.setBeanName("lifecycleBeanPostProcessor");
creator.setProxyTargetClass(true);
return creator;
}
/**
* 3.定义自定义凭证匹配器
*/
@Bean("credentialsMatcher")
public CredentialsMatcher credentialsMatcher(){
return new AuthCredentialsMatcher();
}
/**
* 4.指定自定义的Relam
*/
@Bean("authRealm")
public AuthRealm authRealm(@Qualifier("credentialsMatcher")CredentialsMatcher credentialsMatcher){
AuthRealm authRealm = new AuthRealm();
authRealm.setCredentialsMatcher(credentialsMatcher);
return authRealm;
}
/**
* 5.配置核心安全管理器
*/
@Bean("securityManager")
public DefaultWebSecurityManager securityManager(@Qualifier("authRealm") AuthRealm authRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(authRealm);
return securityManager;
}
/**
* 6.配置权限管理器
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor aASA = new AuthorizationAttributeSourceAdvisor();
aASA.setSecurityManager(securityManager);
return aASA;
}
/**
* 7.配置过滤器链
*/
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
bean.setSecurityManager(securityManager);
bean.setLoginUrl("/");
//设置拦截器链
LinkedHashMap<String,String> map = new LinkedHashMap<String,String>();
map.put("/","anon");
map.put("/login","anon");
map.put("/css/**","anon");
map.put("/components/**","anon");
map.put("/images/**","anon");
map.put("/js/**","anon");
map.put("/skin/**","anon");
map.put("/**","authc");
bean.setFilterChainDefinitionMap(map);
return bean;
}
/**
* 8.thymeleaf设置shiro标签
*注意要用到这个必须加入依赖 且高版本报错2.0以上都报错
<dependency>
<groupId>com.github.theborakompanioni</groupId>
<artifactId>thymeleaf-extras-shiro</artifactId>
<version>1.0.2</version>
</dependency>
*
* @return
*/
@Bean
public ShiroDialect shiroDialect() {
return new ShiroDialect();
}