JEECMS 系统权限设计


JEECMS 系统权限设计
 

1、用户校验.

             登录校验主要围绕着用户后台登陆的url拦截

             a.围绕着用户登录过程中设计到两张用户表

             jc_user:存储着用户的基本信息

             jo_user:存储着用户登录、注册、更新时间及用户密码信息

 

             b.后台用户登录负责处理的servlet是CmsLoginAct类,该类包含两个方法:

             input:根据浏览器的请求指向用户登录页面。

                 submit:用户输入账号信息登录处理method

 

@RequestMapping(value = "/login.do", method = RequestMethod.GET)
	public String input(HttpServletRequest request,
			HttpServletResponse response, ModelMap model) {

 

@RequestMapping(value = "/login.do", method = RequestMethod.POST)
	public String submit(String username, String password, String captcha,String processUrl, String returnUrl, String message,
			HttpServletRequest request, HttpServletResponse response,
			ModelMap model) {

                    这里从submit展开,该方法中主要包含3个操作:

          第一个就是用户的username、password的校验。

public UnifiedUser login(String username, String password, String ip)
			throws UsernameNotFoundException, BadCredentialsException {
		UnifiedUser user = getByUsername(username);//根据用户取得jo_user
		if (user == null) {
			throw new UsernameNotFoundException("该用户未注册: " + username);
		}
		//无需加密后比较
		//TODO DavidfINCH
		//if (!pwdEncoder.isPasswordValid(user.getPassword(), password) && !user.getPassword().equals(password)){
		//不再启用暗文!
		if (!user.getPassword().equals(password)) {//将取来的用户的密码和request获取的密码进行比较,如果成功则返回jo_user
			updateLoginError(user.getId(), ip);
			throw new BadCredentialsException("密码错误!");
		}
		if (!user.getActivation()) {
			throw new BadCredentialsException("该用户信息需激活!");
		}
		updateLoginSuccess(user.getId(), ip);
		return user;
	}

 获取到用户信息后将用户的认证信息保存到数据库中,同时产生一个认证key,放入到session

 

UnifiedUser user = unifiedUserMng.login(username, password, ip);
Authentication auth = new Authentication();
auth.setUid(user.getId());
auth.setUsername(user.getUsername());
auth.setEmail(user.getEmail());
auth.setLoginIp(ip);
save(auth);
session.setAttribute(request, response, AUTH_KEY, auth.getId());

 第二个是从认证表中的取得的user_id ,再获取jc_user

  最后根据传入的returnurl将direct到index.do去处理。

 

2、url校验

 在整个过程中AdminContextInterceptor都对url进行拦截处理。

主要步骤:

从session中取得cmsUser也就是jc_user的信息。

比较url和user.getPerms

private boolean permistionPass(String uri, Set<String> perms,
			boolean viewOnly) {
		String u = null;
		int i;
		for (String perm : perms) {
			if (uri.startsWith(perm)) {
				// 只读管理员
				if (viewOnly) {
					// 获得最后一个 '/' 的URI地址。
					i = uri.lastIndexOf("/");
					if (i == -1) {
						throw new RuntimeException("uri must start width '/':"
								+ uri);
					}
					u = uri.substring(i + 1);
					// 操作型地址被禁止
					if (u.startsWith("o_")) {
						return false;
					}
				}
				return true;
			}
		}
		return false;
	}

 

你可能感兴趣的:(jeecms)