授权中心


无状态登陆

在服务器端保存session
无状态不需要session,把登陆状态保存在cookie中

无状态登录的流程:

  • 当客户端第一次请求服务时,服务端对用户进行信息认证(登录)
  • 认证通过,将用户信息进行加密形成token,返回给客户端,作为登录凭证
  • 以后每次请求,客户端都携带认证的token
  • 服务的对token进行解密,判断是否有效。
  • token的安全性:JWT + RSA非对称加密
    在这里插入图片描述

JWT + RSA非对称加密

token:登陆时,jwt oath2 
jwt:头信息(jwt) 载荷(用户信息,签发人 签发时间 有效时间) 签名(头信息+载荷:通过加密算法生成。作用:校验前两部分内容的合法性)

zuul网关访问的流程

在这里插入图片描述

  • 我们首先利用RSA生成公钥和私钥。私钥保存在授权中心,公钥保存在Zuul和各个信任的微服务
  • 用户请求登录
  • 授权中心校验,通过后用私钥对JWT进行签名加密
  • 返回jwt给用户
  • 用户携带JWT访问
  • Zuul直接通过公钥解密JWT,进行验证,验证通过则放行
  • 请求到达微服务,微服务直接用公钥解析JWT,获取用户信息,无需访问授权中心

搭建授权中心

聚合工程:leyou-auth-common(jwt相关的工具类) leyou-auth-service(微服务)
  • 用户鉴权:
    • 接收用户的登录请求,通过用户中心的接口进行校验,通过后生成JWT
    • 使用私钥生成JWT并返回
  • 服务鉴权:微服务间的调用不经过Zuul,会有风险,需要鉴权中心进行认证
    • 原理与用户鉴权类似,但逻辑稍微复杂一些(此处我们不做实现)

因为生成jwt,解析jwt这样的行为以后在其它微服务中也会用到,因此我们会抽取成工具。我们把鉴权中心进行聚合,一个工具module,一个提供服务的module
在这里插入图片描述
在这里插入图片描述

编写登录授权接口

在leyou-auth-servcice编写一个接口,对外提供登录授权服务。基本流程如下:

  • 客户端携带用户名和密码请求登录
  • 授权中心调用用户中心接口,根据用户名和密码查询用户信息
  • 如果用户名密码正确,能获取用户,否则为空,则登录失败
  • 如果校验成功,则生成JWT并返回

jwtUtils

根据载荷还有私钥生成jwt类型的token
根据公钥解析jwt类型的token,获取载荷信息(userInfo)
rsaUtils(生成公钥和私钥文件,并且读取公钥和私钥文件返回公钥和私钥对象)

登陆功能

1.调用user-service中的queryUser接口,验证用户是否正确
2.判断返回的用户信息是否为空
3.生成jwt类型的token
4.token信息设置到cookie中

首页用户名回显

1.获取Cookie中jwt类型的token @CookieValue("LY_TOKEN")
2.jwtUtils解析jwt,获取用户信息
	判断用户是否为空
3.刷新jwt时间 cookie时间
4.响应用户信息

在zuul网关添加过滤器

在Zuul编写拦截器,对用户的token进行校验,如果发现未登录,则进行拦截。
在这里插入图片描述

编写过滤器逻辑

基本逻辑:

  • 获取cookie中的token
  • 通过JWT对token进行校验
  • 通过:则放行;不通过:则重定向到登录页
    在这里插入图片描述
@Component
@EnableConfigurationProperties(JwtProperties.class)
public class LoginFilter extends ZuulFilter {

    @Autowired
    private JwtProperties properties;

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 5;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        // 获取上下文
        RequestContext context = RequestContext.getCurrentContext();
        // 获取request
        HttpServletRequest request = context.getRequest();
        // 获取token
        String token = CookieUtils.getCookieValue(request, this.properties.getCookieName());
        // 校验
        try {
            // 校验通过什么都不做,即放行
            JwtUtils.getInfoFromToken(token, this.properties.getPublicKey());
        } catch (Exception e) {
            // 校验出现异常,返回403
            context.setSendZuulResponse(false);
            context.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
        }
        return null;
    }
}

白名单;

并不是所有的路径我们都需要拦截,例如:

  • 登录校验接口:/auth/**
  • 注册接口:/user/register
  • 数据校验接口:/user/check/**
  • 发送验证码接口:/user/code
  • 搜索接口:/search/**

另外,跟后台管理相关的接口,因为我们没有做登录和权限,因此暂时都放行,但是生产环境中要做登录校验:

  • 后台商品服务:/item/**

所以,我们需要在拦截时,配置一个白名单,如果在名单内,则不进行拦截。
在application.yaml中添加规则:

leyou:
  filter:
    allowPaths:
      - /api/auth
      - /api/search
      - /api/user/register
      - /api/user/check
      - /api/user/code
      - /api/item

然后读取这些属性:在这里插入图片描述

@ConfigurationProperties(prefix = "leyou.filter")
public class FilterProperties {

    private List<String> allowPaths;

    public List<String> getAllowPaths() {
        return allowPaths;
    }

    public void setAllowPaths(List<String> allowPaths) {
        this.allowPaths = allowPaths;
    }
}

在过滤器中的shouldFilter方法中添加判断逻辑

@Component
@EnableConfigurationProperties({JwtProperties.class, FilterProperties.class})
public class LoginFilter extends ZuulFilter {

    @Autowired
    private JwtProperties jwtProp;

    @Autowired
    private FilterProperties filterProp;

    private static final Logger logger = LoggerFactory.getLogger(LoginFilter.class);

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 5;
    }

    @Override
    public boolean shouldFilter() {
        // 获取上下文
        RequestContext ctx = RequestContext.getCurrentContext();
        // 获取request
        HttpServletRequest req = ctx.getRequest();
        // 获取路径
        String requestURI = req.getRequestURI();
        // 判断白名单
        // 遍历允许访问的路径
        for (String path : this.filterProp.getAllowPaths()) {
            // 然后判断是否是符合
            if(requestURI.startsWith(path)){
                return false;
            }
        }
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        // 获取上下文
        RequestContext ctx = RequestContext.getCurrentContext();
        // 获取request
        HttpServletRequest request = ctx.getRequest();
        // 获取token
        String token = CookieUtils.getCookieValue(request, jwtProp.getCookieName());
        // 校验
        try {
            // 校验通过什么都不做,即放行
            JwtUtils.getInfoFromToken(token, jwtProp.getPublicKey());
        } catch (Exception e) {
            // 校验出现异常,返回403
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(403);
            logger.error("非法访问,未登录,地址:{}", request.getRemoteHost(), e );
        }
        return null;
    }
}

参考

### 架构设计概述 统一用户授权中心的架构设计通常包括以下几个关键组件:身份认证服务、授权服务、用户管理模块、权限管理模块以及审计与监控模块。这些组件共同构成了一个完整的用户授权管理平台,能够为企业提供统一的身份认证授权服务。 #### 身份认证服务 身份认证服务负责验证用户的身份,确保只有合法的用户能够访问系统资源。常见的身份认证方法包括用户名密码认证、多因素认证(MFA)、OAuth 2.0 OpenID Connect 等。身份认证服务需要支持多种认证方式,并能够与现有的身份验证系统(如LDAP、Active Directory)集成[^1]。 ```python def authenticate_user(username, password): # 实现用户名密码认证逻辑 pass ``` #### 授权服务 授权服务负责确定经过身份验证的用户是否有权访问特定的资源。授权服务通常基于角色访问控制(RBAC)或属性基访问控制(ABAC)模型。RBAC 模型通过角色来分配权限,而 ABAC 模型则根据用户的属性(如部门、职位等)来决定访问权限[^1]。 ```python def authorize_user(user, resource): # 实现基于角色或属性的授权逻辑 pass ``` #### 用户管理模块 用户管理模块负责用户的生命周期管理,包括用户的创建、更新、删除以及状态管理(如激活、冻结)。用户管理模块需要提供友好的用户界面,并支持批量操作自动化流程[^1]。 #### 权限管理模块 权限管理模块负责权限的分配、回收以及权限策略的制定。权限管理模块需要支持细粒度的权限控制,并能够根据业务需求灵活调整权限策略。 #### 审计与监控模块 审计与监控模块负责记录分析用户的行为日志,确保系统的安全性合规性。审计与监控模块需要支持实时监控、日志分析以及异常行为检测[^1]。 ### 解决方案优势 统一用户授权中心的解决方案具有以下优势: - **统一身份认证**:通过统一的身份认证服务,用户只需一次登录即可访问多个系统,提高了用户体验[^1]。 - **集中权限管理**:权限管理模块实现了权限的集中管理细粒度控制,确保了系统的安全性。 - **高效用户管理**:用户管理模块提供了高效的用户生命周期管理功能,简化了用户的管理流程[^1]。 - **安全审计与监控**:审计与监控模块确保了系统的安全性合规性,帮助企业及时发现应对安全威胁。 ### PPT展示建议 在制作 PPT 展示时,可以按照以下结构进行: 1. **封面页**:标题、副标题、日期、演讲者信息。 2. **目录页**:列出 PPT 的主要内容结构。 3. **背景介绍**:介绍企业面临的挑战统一用户授权中心的重要性。 4. **架构设计**:详细描述统一用户授权中心的各个组件及其功能。 5. **解决方案优势**:总结统一用户授权中心带来的主要优势。 6. **实施步骤**:分步骤介绍统一用户授权中心的实施计划。 7. **案例分享**:分享成功实施统一用户授权中心的案例。 8. **总结与展望**:总结统一用户授权中心的重要性,并展望未来的发展方向。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值