web开发已经流行了不少年,登陆与受权也基本有一套通用的流程,下面是我本身经常使用的登陆与受权方式,欢迎你们讨论与吐槽.web
概念:
登陆是过程,受权是结果.登陆只是为了得到页面的访问权限 or 操做权限 or 数据权限 or api调用权限.数据库
登陆受权分为两个域:用户域和权限域.api
用户域:用户信息,角色信息。
用户信息:登陆账号,登陆密码,用户名,角色,机构,部门等。
角色信息:角色名,机构,部门等。缓存
权限域:模块信息,权限信息,角色权限。
模块信息:应用中的一个功能块,能够是一个页面(api),也能够是多个页面(api),拥有惟一标识。
权限信息:模块里的功能单元,好比增、删、改、查等。
角色权限:保存角色拥有的权限信息。安全
登陆:
登陆一般是用户输入帐号、密码、验证码而后提交表单进行身份校验而后保存受权信息,如今还有扫码登陆。
保存受权信息:
Cookie:把用户信息加密后保存在Cookie中。
Session:登陆成功后在Cookie里保存SessionId和用户标识。
对比:
Cookie:
优势:不占服务器资源(Cpu资源除外,由于若是信息量大,解密过程很耗资源),使用方便。
缺点:容量有限且不安全。
Session:目前流行的是使用缓存数据库来充当Session服务,例如Redis和Memcache.
优势:
一、容量可根据需求无限拓展,能够很方便的创建独立的登陆受权中心。
二、相较于Cookie,数据很是安全,SessionId是随机和易变的,只有SessionId对应的session信息和用户标识全匹配才算成功。
三、能够很方便拓展成独立的登陆中心以实现统一登陆。服务器
缺点:过程稍微复杂。session
受权:
受权发生在功能模块的入口处,流程以下。
一、获取用户的登陆信息(from Cookie or Session)。
二、经过模块模块惟一标识和用户角色信息获取当前用户在当前模块的权限。
三、把用户当前模块的权限信息写入上下文(HttpContext)中(避免一个请求屡次读取权限信息,后面的操做就能够直接从上下文中获取)加密