Apache Shiro是Java的一个安全框架,官网为shiro.apache.org,主要场景为控制登陆,判断用户是否有访问某个功能的权限等等。
引入Shiro对应的jar包,下面给出Maven
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.2.2</version>
</dependency>
在web.xml中配置spring框架提供的用于整合shiro框架的过滤器
<!-- 配置shiro过滤器 -->
<filter>
<filter-name>shiroFilter</filter-name> // 需要在spring的配置文件中创建一个bean(shiroFilter)
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
下面我们将要进行Shiro的认证功能和授权功能的实现,代码比较多。
我们首先将登录方法按照Shiro指定的方式进行改进
public String login() {
// 获取验证码
String validateCode = (String) ServletActionContext.getRequest().getSession().getAttribute("key");
// 判断验证码
if (StringUtils.isNotBlank(checkcode) && checkcode.equals(validateCode)) {
// 获取getSubject对象,Shiro中代表当前用户对象
Subject subject = SecurityUtils.getSubject();
// 令牌 传递进去前台接受的账号和密码
AuthenticationToken token = new UsernamePasswordToken(model.getUsername(),
MD5Utils.md5(model.getPassword()));// 创建用户名密码令牌对象
try {
subject.login(token); // 调用内置的登录方法来实现检验 如果登陆错误就会抛出异常,返回登录页面
} catch (Exception e) {
e.printStackTrace();
return LOGIN;
}
User user = (User) subject.getPrincipal(); // 登录成功后可以从subject取得登录对象
ServletActionContext.getRequest().getSession().setAttribute("loginUser", user);
return HOME;
} else {
this.addActionError("输入验证码错误");
return LOGIN;
}
}
然后编写
到上面以后编码工作就完成了,剩下的就是进行配置了,首先将编写的
配置
Shiro还提供了使用
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
,可以用在HTMl也可以用在JS中。
如果访问一个页面就执行一次授权,就会访问数据库,浪费资源,所以我们可以使用ehcache来进行缓存权限,只要登录时进行一次授权,后面无需再次授权,直接使用缓存。
shiro自动整合ehcache,只需要简单配置就能使用。
在根目录下建立
<!-- 注册ehcache -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:ehcache.xml" />
</bean>
<property name="cacheManager" ref="cacheManager"/>
一条语句即可。 <!-- 注册安全管理器对象 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="bosRealm"/>
<!-- 将ehcache注入shiro -->
<property name="cacheManager" ref="cacheManager"/>
</bean>