Spring cloud微服务安全实战-3-4 API安全机制之认证(1)

孤者浪人 提交于 2019-11-27 17:46:44

本节开始讲认证相关的东西、注意事项,出现问题的对应的解决方案。

先写用户注册的服务,注册一些用户信息进去。注册也是我们安全体系的一部分

注册

UserController里面的create方法


先修改实体类,加上username和password

因为我们已经在配置文件内配置了generate-ddl为true,启动的时候jpa会自动把这两个属性加到数据库里,这样就不用我们自己手动去数据库里加属性。

设置主键的策略,这里设置的是根据当前数据库的类型策略,例如当前是mysql数据库,那么就会按照mysql数据库的策略。自增的字段策略。

strategy


美 ['strætədʒi]
英 ['strætədʒi]

  • n.策略;战略;策划;战略部署
  • 网络策略模式;谋略;计谋

创建userInfo对象

复制user这个类,改个名字叫做userInfo。
这里把@Entity去掉。因为它不是实体,也就是不和数据库内的表对应。UserInfo用来封装我们服务的请求和响应。
保留@Data注解,这回帮我们生成get和set方法。


UserController里面凡事用到user的地方都改成UserInfo




那么为什么要这么改呢?这两个对象从现在来看,属性是一模一样的,为什么要分成两个呢?这就是编程里面比较常见的一个概念,关注点分离。
也叫做单一职责原则。任何一个类或者方法它应该只关注一个事,或者说只对一个事负责,只有当这个事变化的时候,我才需要改这个类或者这个方法,如果我们用User类来作为Controller的输入或者输出,那么User这个实际上就负责了两件事。第一件事是跟我么的数据库表做映射,这个对象反映出来我们数据库有哪些字段,那个字段是主键等等这些信息,它是负责跟数据库里的表做映射的。
而我们Controoler里面的方法 他的用参和出参实际上是服务的输入和输出。这个实际上是两个概念。 如果我们在这两个关注点上用同一个类。都用User的话,那么User负责的事情就会变多。这个类负责的事情变多就会导致,每一个事变化的时候我都要去改User,就会发生一些问题。
比如数据库结构发生变化的时候,我要去改User,当创建用户或者修改用户的服务发生它的输入和输出发生变化的时候,我也需要去改User
。这个时候User这个类 它的职责就不清晰了。这不是一个好的编程概念。

举个例子,例如用户表里面加一个积分字段。 这个是一个很常见的需求。


如果我加了积分字段,在Controller里面还用User对象作为输入或者输出,就意味着我的注册方法组要的字段里面也多了个积分字段。但是注册的时候,基本没有要求你填写积分信息的吧???所以这就是我们为什么要建这个UserInfo对象的原因。这就是关注点分离。

大家在编程的时候也要注意这一点。它会让你设计出良好的程序。

服务层Service


也就是我们常说的Service层。



在创建Service的实现类






controller层暴露app服务,app服务进来后交给service层,service层再去调用DAO也就是Repository做数据库操作。这样职责就完全区分开了
service层负责实现业务逻辑,Repository专门负责数据库的操作,一般情况下Repository也不会有什么业务逻辑

声明service内的方法。和controller内是对应的

在Service的Impl类里面都 实现这些方法。

把实现类声明称Spring的Service对象,也就是Spring的一个Bean


Controller内调用Service层的方法


写Create方法。使用BeanUtils里面的方法,把传进来的UserInfo对象的值都复制到User这个对象里面。

把user对象保存后的id,复制给info对象,再返回回去。这样前天就能拿到你最终创建的这个用户的id是多少。

这样一个简单的注册就写完了

运行测试


返回的状态码是200。返回的信息就是注册的时候填写的信息,同时还有数据库最终生成的主键自增的id

日志里面打印出了insert语句

数据库内的记录

下面继续写认证的逻辑

先明确几个概念,我们现在讲的是认证,还不是登陆。

认证是验证用户的身份是否合法的这样一个过程。认证这个事 不管 成没成功,它都要往下走。它和登陆不一样。登陆一旦有问题就断掉了。比如说你登陆的时候用户名和填错了。那么我就直接抛异常了,不会再往下走了。认证的时候,如果你传进来的用户身份有问题,仍然要往下走,给下面的审核去记录,记录你这次的身份认证的结果是什么样子的。最终这个请求是不是可以被通过,要由授权来决定。不是由认证来决定的。
明确好了这些概念。就可以写代码。














 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!