SSM整合shiro相关配置
-
首先要在pom.xml文件中添加shiro相关依赖shiro-all,这个依赖包含了shiro-web,shiro-core,shiro-spring,shiro-ehcache…等一系列jar包,所以这里只用添加这一个依赖就够了
org.apache.shiro shiro-all 1.2.2
一般shiro都会用到ehcache缓存还需要添加ehcache依赖
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.8</version>
</dependency>
-
配置web.xml,shiro核心过滤器,所有的请求都会在这里被拦截,这里的一定要和下面spring-shiro.xml配置文件中的过滤器名字保持一致
contextConfigLocation classpath:spring-mybatis.xml,classpath:spring-shiro.xml…
shiroFilter org.springframework.web.filter.DelegatingFilterProxy targetFilterLifecycle true shiroFilter /* -
spring-shiro.xml相关配置,shiro的核心配置文件
/login.jsp /unauthorized.jsp /login.jsp= anon /logout = logout /css/** = anon /images/** = anon /js/** = anon /user/login = anon
<!-- authc需要认证 --> /** = authc </value> </property>
shiro的配置远不止如此,详情可以查看shiro官方文档
4. 配置shiro-ehcache.xml
<!-- 这里就用默认配置就行了,如有兴趣可以自己了解 -->
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<defaultCache
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>
贴上部分ehCache配置
name:缓存名称。
maxElementsInMemory:缓存最大个数。
eternal:对象是否永久有效,一但设置了,timeout将不起作用。
timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
maxElementsOnDisk:硬盘最大缓存个数。
diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
clearOnFlush:内存数量最大时是否清除。
-
自定义Realm
public class ShiroRealm extends AuthorizingRealm {
@Autowired
private UserService userServiceImpl;
@Autowired
private RoleService roleServiceImpl;
@Autowired
private PermissionService permissionServiceImpl;// 认证 @Override protected AuthenticationInfo doGetAuthenticationInfo( AuthenticationToken token) throws AuthenticationException { String username = (String) token.getPrincipal(); User user = userServiceImpl.findByUsername(username); if (user == null) { throw new UnknownAccountException("未找到用户");// 没找到帐号 } ByteSource credentialsSalt = ByteSource.Util.bytes(username); // 交给AuthenticatingRealm使用CredentialsMatcher进行密码匹配 SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( user, // 用户 user.getPassword(), // 密码 credentialsSalt, getName() // realm name ); return authenticationInfo; } // 授权 @Override protected AuthorizationInfo doGetAuthorizationInfo( PrincipalCollection principalCollection) { User user = (User) principalCollection.getPrimaryPrincipal(); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); // 调用业务层,查询角色 List<Role> roles = roleServiceImpl.findRoleByUserId(user.getUserId()); for (Role role : roles) { authorizationInfo.addRole(role.getRoleName()); } // 调用业务层,查询权限 List<Permission> permissions = permissionServiceImpl.findByUserId(user .getUserId()); for (Permission permission : permissions) { authorizationInfo.addStringPermission(permission .getPermissionName()); } return authorizationInfo; } // 清除缓存 public void clearCached() { // 获取当前等的用户凭证,然后清除 PrincipalCollection principals = SecurityUtils.getSubject() .getPrincipals(); super.clearCache(principals); }
}
-
Controller层登录实现
@RequestMapping(“/login”)
public Stringlogin(@RequestBody User user) throws Exception{
Subject subject = SecurityUtils.getSubject();// 获取一个用户对象
AuthenticationToken token = new UsernamePasswordToken(user.getUsername(),user.getPassword());// 将用户名和密码传入login方法中//
subject.login(token);// 调用框架自带的login方法
try {
subject .login(token);
} catch (UnknownAccountException e) {
// 用户名未知…
e.printStackTrace();
return “login.jsp”;
} catch (IncorrectCredentialsException e) {
// 凭据不正确,例如密码不正确 …
e.printStackTrace();
lreturn “login.jsp”;
} catch (LockedAccountException e) {
// 用户被锁定,例如管理员把某个用户禁用…
e.printStackTrace();
return “login.jsp”;
} catch (ExcessiveAttemptsException e) {
// 尝试认证次数多余系统指定次数 …
e.printStackTrace();
return “login.jsp”;
} catch (AuthenticationException e) {
// 其他未指定异常
e.printStackTrace();
return “login.jsp”;
}
return “index.jsp”;
}