认证授权【基础概念篇】
2026/7/26 6:05:10 网站建设 项目流程

什么是认证

认证: 用户认证就是判断一个用户的身份是否合法的过程,用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户名密码登录,二维码登录,手机短信登录,指纹认证等方式

什么是会话

会话就是系统为了保持当前用户的登录状态所提供的机制。简单来说就是保持登录状态,直到系统退出。常见的有基于session方式、基于token方式等。


基于session的认证方式


它的交互流程是,用户认证成功后,在服务端生成用户相关的数据保存在session(当前会话)中,发给客户端的 sesssion_id 存放到 cookie 中,这样用户客户端请求时带上 session_id 就可以验证服务器端是否存在 session数据,以此完成用户的合法校验,当用户退出系统或session过期销毁时,客户端的session id也就无效了。

代码实现

1. 首先需要定义一个唯一的key标识当前用户

public static final String SESSION USER KEY = "user";

2. 服务端认证信息成功后,通过HttpSession的setAttribute将用户信息存入到session中。

3.服务端获取session信息。通过session的getAttribute方法获取存入session的用户信息。

基于token的认证方式

它的交互流程是,用户认证成功后,服务端生成一个token发给客户端,客户端可以放到 cookie 或localStorage 中存储,每次请求时带上 token,服务端收到token通过验证后即可确认用户身份。

session认证和token认证的区别

对服务端而言

session需要将认证信息存储在服务端,存在内存中,session中,数据中都行。

token不需要存储认证信息在服务端。

对客户端而言:

session需要将认证信息存储在cookie中,每次携带认证信息到服务端校验。

token可以将认证信息存储在localStoge或cookie中。

什么是授权

授权: 授权是用户认证通过根据用户的权限来控制用户访问资源的过程,拥有资源的访问权限则正常访问没有权限则拒绝访问。如普通用户无法访问系统后台。在QQ中, 没有绑定银行卡的用户无法收发红包。可以理解为没有授权就做不了权限以外的操作。

RBAC

基于角色的访问控制

RBAC基于角色的访问控制(Role-Based Access Control)是按角色进行授权,比如:主体的角色为总经理可以查询企业运营报表,查询员工工资信息等,访问控制流程如下:

if(主体.hasRole("总经理角色id")){ 查询工资 }

如果上图中查询工资所需要的角色变化为总经理和部门经理,此时就需要修改判断逻辑为”判新用户的角也是否是总经理或部门经理”,修改代码如下:

if(主体.hasRole("总经理角色id")|| 主体.hasRole("部门经理角色id")){ 查询工资 }

可以看到,如果业务发生变化,就需要维护代码,扩展性不强。

基于资源的访问控制

RBAC基于资源的访问控制(Resource-Based AccessControl)是按资源(或权限)进行授权,比如:用户必须具有查询工资权限才可以查询员工工资信息等,访问控制流程如下:

if(主体.hasPermission("查询工资权限标识”)){ 查询工资 }

这样不管哪个角色需要查询工资,只需要分配一个权限即可,只要有权限就可以访问,而不用修改代码。

代码实现

1. 定义Interceptor拦截器拦截请求, 这个Bean需要实现 HandlerInterceptor 接口。

@Component public class SimpleAuthenticationInterceptor implements HandlerInterceptor { @0verride public boolean prelandle(HttpServletRequest request, HttpServletResponse response, 0bject handler) throws Exception { //在这个方法中校验用户请求的u1是否在用户的权限范围内 //取出用户身份信息 Object object = request.getSession().getAttribute(UserDto. SESSION USER KEY); if(object == nul1){ //没有认证,提示登录 writeContex(response,msg:“请登录”); } UserDto userDto=(UserDto) object: //请求的url String requestURI = request.getRequestURI(); if(userDto.getAuthorities().contains("p1") && requestURl.contains("/r/r1")) { return true; } if(userDto.getAuthorities().contains("p2") && requestURl.contains("/r/r2")) { return true; } writeContent(response,"权限不足,拒绝访问"); return false; } //响应信息给客户端 private void writeContent(HttpServletResponse response, String msg)throws IOException { PrintWriter writer=response.getWriter(); writer.print(msg); writer.close(): } }

2. 在WebConfig配置类中注入定义好的拦截器

// 注入拦截器 @Autowired private SimpleAuthenticationInterceptor simpleAuthenticationInterceptor; @Override public void addInterceptors(InterceptorRegistry registry){ registry.addInterceptor(simpleAuthenticationInterceptor) .addPathPatterns("/r/**"); // 拦截r开头的请求

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询