l shiro框架的核心功能:
认证
授权
会话管理
加密
1.认证
shiro框架认证流程
applicationCode:应用程序代码,由开发人员负责开发
Subject:框架提供的接口,指当前用户对象
SecurityManager:安全管理器,框架提供,主体进行认证和授权都是通过securityManager进行
Realm:框架提供,也可以自己编写,类似于dao,用于访问权限数据
认证的操作步骤
第一步:pom.xml文件中添加shiro的依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.2.2</version>
</dependency>
第二步:web.xml中配置shiro的核心过滤器
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:如果shiro框架与Strust2框架一起使用,shiroFilter需要配置在Strust2核心过滤器的前面
第三步:在Spring配置文件中进行相关配置
bean的id需要与web.xml中配置的filter的name一致
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 注入安全管理器对象 -->
<property name="securityManager" ref="securityManager" />
<!-- 注入相关页面访问URL -->
<property name="loginUrl" value="/login.jsp" /> <!-- 登录页面 -->
<property name="successUrl" value="/index.jsp" /><!-- 认证成功后需要跳转到的页面 -->
<property name="unauthorizedUrl" value="/unauthorized.jsp" /><!-- 认证失败需要跳转的页面-->
<!-- 注入URL拦截规则 -->
<property name="filterChainDefinitions">
<value>
/css/** = anon
/js/** = anon
/images/** = anon
/validatecode.jsp* = anon
/login.jsp = anon
/user_login.action = anon
/page_base_staff.action = perms["staff-list"]
/* = authc
</value>
</property>
</bean>
shiroFilter中,还需要注入如下的属性:
filterChainDefinitions:定义shiro的拦截规则
authc:代表shiro框架提供的一个过滤器,这个过滤器用于判断当前用户是否已经完成认证,如果当前用户已经认证,就放行,如果当前用户没有认证,跳转到登录页面
anon:代表shiro框架提供的一个过滤器,允许匿名访问
perms:代表shiro框架提供的一个过滤器,表示用户需要具有[]内的权限,才可以访问
SecurityManager
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="bosRealm" />
<property name="cacheManager" ref="cacheManager" />
</bean>
SecurityManager中需要注入如下属性
Realm:
可自己编写也可使用框架提供,Realm的核心是认证和授权两个方法
<!-- 注册realm -->
<bean id="bosRealm" class="com.itheima.bos.realm.BosRealm"></bean>
CacheManager:
将用户权限存放到缓存中去,避免每次发送请求都去查询用户权限
<!-- 注册缓冲管理器 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:ehcache.xml" />
</bean>
ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
第四步:在自己的login方法中使用shiro的登录验证
public String login() {
public String login() {
// 使用shiro框架提供的方式进行认证
Subject subject = SecurityUtils.getSubject();
String md5 = MD5Utils.md5(user.getPassword());
UsernamePasswordToken token = new UsernamePasswordToken(
user.getUsername(), md5);
try {
subject.login(token);//该方法执行,将会最终调用realm中的认证方法对登录账号进行校验
User user = (User) subject.getPrincipal();
ActionContext.getContext().getSession().put("loginUser", user);
} catch (Exception e) {//没有异常抛出,说明校验通过
e.printStackTrace();
this.addActionError("用户名或密码错误,登录失败!");
return INPUT;
}
return "loginSuccess";
}
Subject subject = SecurityUtils.getSubject();
String md5 = MD5Utils.md5(user.getPassword());
UsernamePasswordToken token = new UsernamePasswordToken(
user.getUsername(), md5);
try {
subject.login(token);//该方法执行,将会最终调用realm中的认证方法对登录账号进行校验
User user = (User) subject.getPrincipal();
ActionContext.getContext().getSession().put("loginUser", user);
} catch (Exception e) {//没有异常抛出,说明校验通过
e.printStackTrace();
this.addActionError("用户名或密码错误,登录失败!");
return INPUT;
}
return "loginSuccess";
}
第五步:编写realm的认证方法
继承AuthorizingRealm,实现其中的两个方法,认证:doGetAuthorizationInfo和授权:doGetAuthenticationInfo
public class BosRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken arg0) throws AuthenticationException {
// TODO Auto-generated method stub
return null;
}
}
认证方法的代码如下
@Override
public AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken myToken = (UsernamePasswordToken) token;
User user = uDao.queryByUsername(myToken.getUsername());
if (user == null)// 如果用户没有查到,返回null
return null;
// 如果用户可以查到,再由框架比对数据库中查询到的密码和页面提交的密码是否一致
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,
user.getPassword(), this.getName());
return info;
}
2.授权
第一步:在applicationContext的shiroFilter中的filterChainDefinition中添加需要进行权限校验的action
如上面记录的/page_base_staff.action = perms["staff-list"],即表示,用户需要有staff-list权限,才有权访问/page_base_staff.action
-------------------------------------------------------------------------
授权感觉自己还是没有目标,暂时不写了