如何创建一个APPS后台服务(二)权限控制

 说到权限控制,很多人的第一反应是session。也确实在分布式前,权限控制基本都是靠session来控制,很多传统企业还是保持用session作为权限控制的首选,包括我目前服务的某银行的手机银行。

 

一、session 的理解

 

      曾经很长一段时间,我固化思维似的认为session 就是登录后存放用户信息,登录的时候才能用session .其他action是不能用的。如以下代码,字体红色部分:

/********************
 * 用户登录
 * @param userId
 * @param userPwd
 * @param picCode
 * @param request
 * @return
 */
@RequestMapping("/login")
@ResponseBody
public BaseObject login( String userId, String userPwd, String picCode, HttpServletRequest request) {

    User user = new User();
    user.setUserId(userId);
    user.setUserPwd(userPwd);
    MeService meService = new MeService();
    User ruser = null;

    try {

        if (picCode == null || !picCode.equalsIgnoreCase(request.getSession().getAttribute("randomPic").toString())) {

            return ControllerHelper.getRtnObject(CommonConst.RTN_CODE_12,"图形验证码输入错误");
        }
        ruser = meService.login(user);
        request.getSession().setAttribute("user",ruser)
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        App.log.error( e.getMessage());
        return ControllerHelper.getErrorRtnObject();
    }

    return ruser;
}

 

亏我还是学计算机专业的呢。

 

那session 还有什么应用场景呢?一个很常用的列子,如用户登录界面显示的图形验证码:

在获取程序时,就可以把图形验证码,缓存在session中:

@RequestMapping("/randomPic")
/************
 * 获取图形验证码
 * 
 * @param request
 * @param response
 */
public void randomPic(HttpServletRequest request, HttpServletResponse response) {

    ValidateCode vc = new ValidateCode();

    response.setContentType("image/png");

    OutputStream stream;
    try {
        stream = response.getOutputStream();
        request.getSession().setAttribute("randomPic", vc.getCode());
        vc.write(stream);

        stream.flush();
        stream.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

 

在登录交易中就可以验证了

 

    if (picCode == null || !picCode.equalsIgnoreCase(request.getSession().getAttribute("randomPic").toString())) {

        return ControllerHelper.getRtnObject(CommonConst.RTN_CODE_12,"图形验证码输入错误");
    }

 

有了以上例子我们可以再看一下session的概念:

 

Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的.

 

  Session是存在服务器端的,只有客户端向服务器发起请求,服务器端处理成功后为这个客户端分配一个sessionId,后续所有的会话都会带着这个Id。这也就实现了获取验证码交易与登录交易的数据共享。

 

二、权限控制

 

  就跟对session 权限控制的狭隘一样,刚工作的时候。我的权限控制也是局限在登录与非登录的控制。巧合的时候,很多没有工作经验的大学生或者培训机构的学员的简历很喜欢写权限控制,结果一问基本也都是登录的控制,再复杂的设计也就没有了。

 

  简单介绍一下,我第一次接触的权限设计:

 

 

  1、用户对应角色,一个用户可以多个角色

        2、角色对应功能

 

     权限控制:

     1、用户登录成功后,查询该用户所属角色以及该角色下所能操作的所有功能

     2、在功能界面显示该用户拥有的功能模块

 

     3、增加拦截器,所有验证交易验证(1、验证用户是否拥有该模块ID的操作权限2、验证该模块的功能ID与请求URL是否相符^-^这是为什么呢)

 

还是有点后续无力了,今天就到这里,为自己加油吧

  

posted @ 2018-11-30 11:00  ApiluDagny  阅读(181)  评论(0)    收藏  举报