1. 引入pom文件:
版本号:1.2.3
org.apache.shiro
shiro-spring
${shiro.version}
org.apache.shiro
shiro-ehcache
${shiro.version}
org.apache.shiro
shiro-core
${shiro.version}
org.apache.shiro
shiro-web
${shiro.version}
org.apache.shiro
shiro-quartz
${shiro.versio
2. 在web.xml文件中配置过滤器:
shiroFilter
org.springframework.web.filter.DelegatingFilterProxy
shiroFilter
/*
3. 在spring文件中配置:
(如果单独创建文件spring-shiro.xml 项目启动后会出现数据库访问用户错误的现象.建议与spring-mybatis文件写在一起,在datasource配置之后.)
(注意:该过滤器名称需要与web.xml文件中的过滤器名称相同)
"shiroFilter"class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
"securityManager"ref="securityManager">
"loginUrl"value="/front/login">
"successUrl"value="/front/index">
"unauthorizedUrl"value="/front/login">
"filterChainDefinitions">
/styless/** = anon
/images/** = anon
/javascripts/** = anon
/open/** = anon
/forward/** = anon
- /front/index= perms["staff"]
/** = authc
"securityManager"class="org.apache.shiro.web.mgt.DefaultWebSecurityManager ">
"realm"ref="realmzhihu">
"cacheManager"ref="cacheManager">
(注意:需要缓存文件)
"cacheManager"class="org.apache.shiro.cache.ehcache.EhCacheManager">
"cacheManagerConfigFile"value="classpath:ehcache.xml"/>
"sessionManager"class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
"globalSessionTimeout"value="600000"/>
"deleteInvalidSessions"value="true"/>
"realmzhihu"class="com.julian.shiro.RealmZhihu">
"org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
"true"name="proxyTargetClass"/>
"org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
"securityManager"ref="securityManager"/>
4创建一个继承AuthorizingRealm的类:
(需要重写认证和授权方法)
/**
*认证方法
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationTokentoken)throwsAuthenticationException {
UsernamePasswordTokenmyToken= (UsernamePasswordToken)token;
Stringusername=myToken.getUsername();
char[]password=myToken.getPassword();
Managermg=newManager();
mg.setUsername(username);
ListselectAllManager=managerService.selectAllManager(mg);
if(selectAllManager.size() <= 0) {
returnnull;
}
/**
*参数说明
*1签名对象,认证通过之后可在程序的任意位置获取该对象
*2数据库中查询的密码
*3当前realm的类名
*/
SimpleAuthenticationInfoinfo=newSimpleAuthenticationInfo(selectAllManager.get(0),selectAllManager.get(0).getPassword(),this.getClass().getName());
returninfo;
}
/**
*授权方法
*/
@Override
protectedAuthorizationInfo doGetAuthorizationInfo(
PrincipalCollectionprincipals) {
//授权信息对象
SimpleAuthorizationInfoinfo=newSimpleAuthorizationInfo();
//根据当前登录用户查询数据库,获得其对应的权限
Manageruser=(Manager)principals.getPrimaryPrincipal();
if(user.getUsername().equals("admin")){
//超级管理员,查询所有权限
Listlist=functionService.findAllFunctions();
for(Functionfunction:list) {
info.addStringPermission(function.getFunctionCode());
}
}else{
//普通用户,根据用户查询对应的权限
Listlist=functionService.findFunctionsByUserId(user.getId());
for(Functionfunction:list) {
info.addStringPermission(function.getFunctionCode());
}
}
returninfo;
}
4. 如何调用认证方法:
(注意:在过滤器中authc,表示需要认证才可以访问,而anon表示可以匿名访问不需要认证)
a.在登录方法中
//获取Subject对象(相当于创建给当前用户创建一个shiro框架中的当前对象)
Subjectsubject= SecurityUtils.getSubject();
password= MD5Utils.md5(password);
//用于存放当前用户的用户名和密码
UsernamePasswordTokenusernamePasswordToken=newUsernamePasswordToken(username,password);
//调用安全管理器,安全管理器调用Realm
subject.login(usernamePasswordToken);
会自动调用realm中的认证方法
5. 授权操作:
基于过滤器的权限控制:
在这个配置当中,perms[“staff”] 表示该路径需要具有admin权限才可以访问.
shiro在执行认证方法后,会自动执行授权方法
基于注解的方式:
1. 需要在springmvc的配置文件中引入aop
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
2. 配置:
(该配置的意思是:自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面,属性proxy-target-class为true表示基于类的代理被创建,为false基于接口的代理被创建)
"true"/>
3.Spring的配置文件中也需要配置自动代理
4.在需要被权限控制的类中创建ParameterizedType对象
ParameterizedTypegenericeSuperclass=null;
publicManagerController(){
genericeSuperclass=(ParameterizedType)this.getClass().getSuperclass().getGenericSuperclass();
}
5.在需要访问的方法上添加注解
@RequiresPermissions("staff") //表示只有拥有staff权限的用户才能够访问
(注意:方法一与方法二可以重叠使用,但是尽量不要冲突)
基于标签的方式:
使用shiro标签根据权限展示页面元素
l 在jsp页面中引入标签库
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
l 使用标签