架构师之路:组织机构管理和权限设计模型(Shiro实现)

更多视频教程索取

对于学习有困难不知道如何提升自己可以加Q群:702101215(文末扫码)

/**
 * 查询要禁用的用户是否在线。
 * @param id		用户ID
 * @param status	用户状态
 */
public void forbidUserById(Long id, Long status) {
	//获取所有在线用户
	for(UserOnlineBo bo : getAllUser()){
		Long userId = bo.getId();
		//匹配用户ID
		if(userId.equals(id)){
			//获取用户Session
			Session session = shiroSessionRepository.getSession(bo.getSessionId());
			//标记用户Session
			SessionStatus sessionStatus = (SessionStatus) session.getAttribute(SESSION_STATUS);
			//是否踢出 true:有效,false:踢出。
			sessionStatus.setOnlineStatus(status.intValue() == 1);
			//更新Session
			customShiroSessionDAO.update(session);
		}
	}
}

CK031-组织机构管理和权限设计模型(Shiro实现)

学习要趁早,点滴记录,学习就是进步!

随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到程序开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了。对于学习有困难不知道如何提升自己可以加扣:1225462853进行交流得到帮助,获取学习资料.

CK031-组织机构管理和权限设计模型(Shiro实现)

下载地址:http://pan.baidu.com/s/1jI05TPW



登录注册密码加密传输

这个地方好多人纠结的。比如密码过于简单,即使加密后也能破解。如我们把密码:123456,加密后就是:e10adc3949ba59abbe56e057f20f883e

这个很容易被识别,导致不安全,现在市面上的MD5破解其实就是把常用的数字,字母进行先加密,然后对比,美其名曰破解MD5。

那怎么能让用户即使使用很简单的密码,也发现不了?

本Demo的实现方式是:MD5(登录帐号 + “固定值” + 密码),把这个作为密码,这样,基本是不可能猜的出来。

/Java代码。UserManager.md5Pswd(UUser user);
/**
 * 加工密码,和登录一致。
 * @param user
 * @return
 */
public static UUser md5Pswd(UUser user){
	//密码为   email + '#' + pswd,然后MD5
	user.setPswd(md5Pswd(user.getEmail(),user.getPswd()));
	return user;
}
/**
 * 字符串返回值
 * @param email
 * @param pswd
 * @return
 */
public static String md5Pswd(String email ,String pswd){
	pswd = String.format("%s#%s", email,pswd);
	pswd = MathUtil.getMD5(pswd);
	return pswd;
}

Spring定时任务数据初始化

这个Demo因为是开放的,所以创建了一个定时任务。每20分钟执行一次,用Mysql存储过程重新创建表,重新插入初始化数据。

具体数据看项目中的init/sql下的tables.sql(初始化表),init.data.sql(初始化数据)。

//定时任务配置文件spring-timer.xml
<task:executor id="executor" pool-size="5" />  
<task:scheduler id="scheduler" pool-size="10" />  
<task:annotation-driven executor="executor" scheduler="scheduler" />
//Java 代码 RoleServiceImpl.java
/**
 * 每20分钟执行一次
 */
@Override
@Scheduled(cron = "0 0/20 * * * ? ")
public void initData() {
	roleMapper.initData();
}

如果需要保存登录之前的Request信息,那么需要在Login拦截的Filter中先保存:

@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response)
		throws Exception {
	//保存Request和Response,登录后可以取到
	saveRequestAndRedirectToLogin(request, response);
	return Boolean.FALSE ;
}
//登录后,取到之前的Request中的一些信息。
SavedRequest saveRequest = WebUtils.getSavedRequest(request);
saveRequest.getMethod();//之前的请求方法
saveRequest.getQueryString();//之前请求的条件
saveRequest.getRequestURI();//之前请求的路径
saveRequest.getRequestUrl();//之前请求的全路径


用户禁止登录Demo

这个功能其实是一个改变用户数据库表里的一个字段,本Demo中:1:有效,0:禁止登录

然后踢出用户登录状态。代码详细请查看CustomSessionManager.java类的forbidUserById(Long id, Long status)方法。

而再次登录的话,需要再登录,而登录的地方限制了用户状态为(0:禁止登录)的用户登录。


/**
 * 查询要禁用的用户是否在线。
 * @param id		用户ID
 * @param status	用户状态
 */
public void forbidUserById(Long id, Long status) {
	//获取所有在线用户
	for(UserOnlineBo bo : getAllUser()){
		Long userId = bo.getId();
		//匹配用户ID
		if(userId.equals(id)){
			//获取用户Session
			Session session = shiroSessionRepository.getSession(bo.getSessionId());
			//标记用户Session
			SessionStatus sessionStatus = (SessionStatus) session.getAttribute(SESSION_STATUS);
			//是否踢出 true:有效,false:踢出。
			sessionStatus.setOnlineStatus(status.intValue() == 1);
			//更新Session
			customShiroSessionDAO.update(session);
		}
	}
}



猜你喜欢

转载自blog.csdn.net/cadn_jueying/article/details/78669443
今日推荐