1.2 整合shiro
1.2.1 maven坐标
步骤1:在common-parent项目中,添加maven坐标
<!--shiro start-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!--shiro end-->
1.2.2 配置过滤器
使用Shiro时,需要配置的相关权限过滤器如下(共10个):
anon: 匿名过滤器,未登陆也可以访问
authc: 认证过滤器, 登陆后访问
perms : 需要xx权限,才能访问
roles: 需要xx角色,才能访问
user: 需要xx用户,才能访问
port:指定端口才能访问
ssl:必须使用https协议才能访问
logout :登出功能
rest :根据指定HTTP请求访问才能访问 ,get方式提交 或者 post方式提交才能访问 可
1.2.3 配置config类
shiro的配置步骤
1 配置安全管理器SecurityManager
2 realm域配置:由于SecurityManger需要使用realm域,涉及到用户信息、权限信息,处理用户信息的时候需要加密
3 密码比较器:用户输入的铭文进行加密,并且与数据库中的密文进行比较
4 配置生成过滤器的工厂类
/**
* 在ShiroConfig中做什么事情呢?
* 1 配置shiro安全管理器,向安全管理器中注入Realm域
* 2 配置Realm域:注入密码比较器
* 3 配置密码比较器
* 4 配置拦截路径和放行路径
*/
@Configuration
public class ShiroConfig {
/**
* 配置安全管理器,并且注入Realm域
* @param realm
* @return
*/
@Bean
public SecurityManager securityManager(Realm realm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(realm);
return securityManager;
}
/**
* Credentials:凭证/证书 ---
*
* 配置Realm域,注入密码比较器
* @param credentialsMatcher
* @return
*/
@Bean
public BosRealm realm(CredentialsMatcher credentialsMatcher){
BosRealm bosRealm = new BosRealm();
bosRealm.setCredentialsMatcher(credentialsMatcher);
return bosRealm;
}
/**
* 密码比较器
*
* @return
*/
@Bean
public CredentialsMatcher credentialsMatcher(){
// return new HashedCredentialsMatcher("MD5");
return new BosCredentialsMatcher();
}
/**
* 配置拦截路径和放行路径
* @param securityManager
* @return
*/
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){
System.out.println("ShiroConfiguration.shirFilter()");
// shiro过滤器工厂类
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// 必须设置 SecurityManager
shiroFilterFactoryBean.setSecurityManager(securityManager);
//拦截器----Map集合
Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();
//配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了
filterChainDefinitionMap.put("/login*", "anon");
filterChainDefinitionMap.put("/user/login*", "anon");
filterChainDefinitionMap.put("/validatecode.jsp*", "anon");
filterChainDefinitionMap.put("/css/**", "anon");
filterChainDefinitionMap.put("/js/**", "anon");
filterChainDefinitionMap.put("/images/**", "anon");
filterChainDefinitionMap.put("/data/**", "anon");
// /** 匹配所有的路径
// 通过Map集合组成了一个拦截器链 ,自顶向下过滤,一旦匹配,则不再执行下面的过滤
// 如果下面的定义与上面冲突,那按照了谁先定义谁说了算
// /** 一定要配置在最后
filterChainDefinitionMap.put("/**", "authc");
// 将拦截器链设置到shiro中
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
// 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
shiroFilterFactoryBean.setLoginUrl("/login.html");
// 登录成功后要跳转的链接
shiroFilterFactoryBean.setSuccessUrl("/index.html");
//未授权界面;
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
return shiroFilterFactoryBean;
}
/**
* 开启shiro aop注解支持
* 使用代理方式;所以需要开启代码支持
* @param securityManager
* @return
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
/**
* 开启cglib代理
* @return
*/
@Bean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
creator.setProxyTargetClass(true);
return creator;
}
}
根据配置文件报错显示,需要创建如下文件:
1 BosRealm域
2 BosCredentialsMatcher密码比较器
//自定义Realm ,实现安全数据 连接
public class BosRealm extends AuthorizingRealm {
// 认证...
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) {
System.out.println("shiro 认证管理... ");
return null;
}
@Override
// 授权...
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) {
System.out.println("shiro 授权管理...");
return null;
}
}
1.2.5 编写密码比较器
public class BosCredentialsMatcher extends SimpleCredentialsMatcher {
@Override
public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
System.out.println("密码比较器");
return false;
}
}
授权
//拦截器.
Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();
//配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了
filterChainDefinitionMap.put("/login*", "anon");
filterChainDefinitionMap.put("/validatecode.jsp*", "anon");
filterChainDefinitionMap.put("/user/login*", "anon");
filterChainDefinitionMap.put("/css/**", "anon");
filterChainDefinitionMap.put("/js/**", "anon");
filterChainDefinitionMap.put("/images/**", "anon");
filterChainDefinitionMap.put("/services/**", "anon");
filterChainDefinitionMap.put("/pages/base/courier**", "perms[courier:list]");
filterChainDefinitionMap.put("/pages/base/area**", "roles[base]");
//<!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;
//<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
filterChainDefinitionMap.put("/**", "authc");
// 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
shiroFilterFactoryBean.setLoginUrl("/login.html");
// 登录成功后要跳转的链接
shiroFilterFactoryBean.setSuccessUrl("/index.html");
//未授权界面;
shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized.html");```