用Spring Boot & Cloud,Angular2快速搭建微服务web应用 - 增加权限控制

接下来我们来看看如何增加权限控制,即提供用户认证和鉴权的功能。
摘要由CSDN通过智能技术生成

接下来我们来看看如何增加权限控制,即提供用户认证和鉴权的功能。首先有3个比较重要的架构设计选择:

  1. 使用Spring的OAuth 2.0,还是使用Spring Session。虽然Spring对OAuth 2.0的支持已经很完善了,简化了大量的配置和开发,但是OAuth 2.0本身还是比较复杂的,尤其是要使用JWT(JSON Web Tokens)和CORS的情况下。OAuth 2.0的应用场景,也包含了许多我们当前并不需要的功能。从简单够用的理念出发,我决定先选择使用Spring Session。
  2. 用户登陆和Session管理的功能放在哪里?用户登陆很自然的放在gateway里面会比较好,作为整个网站的入口。不过里面有一个问题是用户的信息放在数据库里面。如果登陆放在gateway项目里面,会与user-service有一些重复的代码。考虑到登陆和user-service实际上是不同的功能,重复的代码也就是一个User类,还有一个findByUsername方法,还是决定将登陆放在gateway。
  3. portal是继续放在node.js在用npm单独运行,还是放在gateway的resource里面,作为gateway运行时的一部分?如果放在gateway里面,则前端的开发不能完全脱离后端,在开发中会丧失一部分的灵活性(不过前端也不可能完全脱离后端)。如果在node.js里面运行,则后端需要考虑CORS的问题。浏览器在跨域访问的时候,还会在实际的HTTP请求之前,先插入一个preflight的请求,请求方法是OPTIONS。为了支持CORS,后端需要做很多配置,包括安全配置(允许OPTIONS请求),CORS过滤器(或者配置器)等。CORS的配置需要允许跨域访问,也带来一下安全隐患。并且在正式部署中,如果用Angular2 Cli工具打包portal,则这些配置可能都没有用处了。本着不过度设计的原则,我决定先选择将前端放在gateway里面。

那么下面的第一步就是把portal目录移到到gateway/main/java/resource/static目录下面。我尝试了在Windows下面使用Symlink,但是Eclipse当前版本(Neon)不支持Windows的Symlink,即不能正常解析里面的文件。如果用Eclipse自带的Linked Folder,Maven又不能正常拷贝里面的文件到target,所以只好老老实实的将portal的内容移动到static,并且删除portal。

Spring Boot提供的用户认证和鉴权功能,牵涉到了Spring Session,Spring Security的功能。

Spring Session

Spring Session提供了用户session管理的实现和接口。基本上Spring默认的实现可以满足大部分应用的需求。实现还提供了和HttpSession的集成,并且默认使用的是流行的Session管理内存No SQL数据库系统Redis。对于使用RESTful API的微服务,Spring Session通过在HTTP Header中添加session ID的方式来支持。在使用Spring Boot时,所有这些都基本上不需要开发人员编写代码,只需要在pom中增加依赖spring-boot-starter-redis和spring-session。具体请参考: http://projects.spring.io/spring-session/,以及 http://docs.spring.io/spring-session/docs/current/reference/html5/

Spring Security

Spring Security实现了基于角色的访问控制,并且支持CORS,CSRF等。具体请参考: http://projects.spring.io/spring-security/,以及 http://docs.spring.io/spring-security/site/docs/current/guides/html5/。不过即使是基于spring-boot-starter-security,也需要开发人员根据项目情况进行配置,编写配置代码。如果用户的信息在数据库中,则需要实现UserDetailsService的loadUserByUsername方法,供Spring Security调用,以取得登陆用户的密码,状态信息和角色信息。另外还要继承WebSecurityConfigurerAdapter类,并且至少重写参数为HttpSecurity的configure方法。

这里值得一提的是,Spring Security从版本3开始,支持BCrypt算法。该算法除了比MD5和SHA1强度更高,更不容易被暴力破解以外,另一个特点就是产生的最终密码包含了salt(盐)。为了防止拖库之后的彩虹表攻击,如果采用SHA1,一般还需要在数据库的用户表中增加一个salt字段,存放盐值。这样就比较麻烦,另外如果盐值不是随机的,或者生成的算法不好,也比较容易受到攻击。BCrypt解决了这个问题,该算法产生的最终密码包含了一个随机的盐值,验证的时候无需再提供单独的盐值。具体请参考: https://en.wikipedia.org/wiki/Bcrypt。要使用该算法,需要重写参数为AuthenticationManagerBuilder的configure方法。

gateway实现

UserDetailServiceImpl.java
package com.healtrav.session;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
public class UserDetailServiceImpl implements UserDetailsService {

    private final UserRepository userRepo;

    @Autowired
    public UserDetailServiceImpl(UserRepository userRepo) {
        this.userRepo = userRepo;
    }

    @Override
    public UserDetails loadUserByUsername(
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值