SSM整合shiro相关配置

SSM整合shiro相关配置

  1. 首先要在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>
  1. 配置web.xml,shiro核心过滤器,所有的请求都会在这里被拦截,这里的一定要和下面spring-shiro.xml配置文件中的过滤器名字保持一致

    contextConfigLocation classpath:spring-mybatis.xml,classpath:spring-shiro.xml

    shiroFilter org.springframework.web.filter.DelegatingFilterProxy targetFilterLifecycle true shiroFilter /*
  2. 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:内存数量最大时是否清除。

  1. 自定义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);
    }
    

    }

  2. 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”;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值