美文网首页springboot
spring boot、mybatis 实现用户登录接口

spring boot、mybatis 实现用户登录接口

作者: hyrijk | 来源:发表于2017-02-05 10:09 被阅读3202次

    上次写了用户注册接口的实现,接着写登录接口

    传统的登录验证方式是 session + cookie 的形式,这种验证方式不太适用于只提供 restful api 的后端系统,所以选择了 基于 token 的验证方式。

    token 是个长字符串,客户端向服务器申请。在需要登录的请求中每次都携带上申请到的token,服务器端验证 token 的有效性,只有验证通过了才允许访问。具体怎么验证 token 下次再写,先来看看怎么生成 token。

    我使用了JWT 形式的 token, 关于 JWT(JSON Web Token),可以看看下面两篇文章

    1. JSON Web Token - 在Web应用间安全地传递信息
    2. 八幅漫画理解使用JSON Web Token设计单点登录系统

    对比上次的目录结构,多了 AuthenticationApi.java 和 AuthenticationService.java 两个文件


    目录结构

    添加 JWT 依赖

    jwt 的 java 实现由很多,经过对比,选择了下面这个。 在 pom.xml 中添加

    <dependency>
        <groupId>com.auth0</groupId>
        <artifactId>java-jwt</artifactId>
        <version>3.0.2</version>
    </dependency>
    

    Controller 层

    新建 AuthenticationApi.java 文件

    @RestController
    @RequestMapping("/api/authentication")
    public class AuthenticationApi {
        private AuthenticationService authenticationService;
        private UserService userService;
    
        @Autowired
        public AuthenticationApi(AuthenticationService authenticationService, UserService userService) {
            this.authenticationService = authenticationService;
            this.userService = userService;
        }
    
        @PostMapping("")
        public Object login(@RequestBody User user) {
            User userInDataBase = userService.findByName(user.getName());
            JSONObject jsonObject = new JSONObject();
            if (userInDataBase == null) {
                jsonObject.put("message", "用户不存在");
            } else if (!userService.comparePassword(user, userInDataBase)) {
                jsonObject.put("message", "密码不正确");
            } else {
                String token = authenticationService.getToken(userInDataBase);
                jsonObject.put("token", token);
                jsonObject.put("user", userInDataBase);
            }
            return jsonObject;
        }
    }
    

    Service 层

    新建 AuthenticationService.java

    @Service
    public class AuthenticationService {
        public String getToken(User user) {
            String token = "";
            try {
                token = JWT.create()
                        .withAudience(user.getId().toString())          // 将 user id 保存到 token 里面
                        .sign(Algorithm.HMAC256(user.getPassword()));   // 以 password 作为 token 的密钥
            } catch (UnsupportedEncodingException ignore) {
            }
            return token;
        }
    }
    

    添加 comparePassword 方法

    编辑 UserService.java,添加

        public boolean comparePassword(User user, User userInDataBase) {
            return passwordToHash(user.getPassword())      // 将用户提交的密码转换为 hash
                    .equals(userInDataBase.getPassword()); // 数据库中的 password 已经是 hash,不用转换
        }
    

    测试

    为了方便,使用 postman 这个程序来测试。

    • 先添加一个用户


      添加用户

      从返回的 Body 那里,可以看到创建用户成功。

    • 正常登陆


      登陆成功
    • 用户不存在时


      用户不存在
    • 密码错误时


      密码错误

    查看项目完整代码

    项目地址: https://github.com/hyrijk/spring-boot-blog
    克隆项目到本地

    git clone https://github.com/hyrijk/spring-boot-blog.git
    

    checkout 到当前版本

    git checkout 201c830d765d00014394563169b21bc1eb6c2a37
    

    完。

    相关文章

      网友评论

      • 025683ae3947:请问博主,我在postman做测试的时候报错404,经检查路径都是对的,请问跟我用的是myeclipse有关系吗??
        hyrijk:@无名不虚清 404 不会是数据库的问题。只可能是代码没生效或路径不对或请求方式不对(GET 还是 POST)
        025683ae3947:@hyrijk 萌新,请博主多担待,谢谢!今天来从新启动了还是不行,我实在application.properties里面
        server.port=9990
        spring.datasource.url=jdbc:mysql://localhost:3306/peimiapp
        spring.datasource.username=root
        spring.datasource.password=123
        spring.datasource.driver-class-name=com.mysql.jdbc.Driver

        mybatis.mapper-locations=classpath\:mybatis/mapper/*Mapper.xml
        mybatis.config-locations=classpath:mybatis/mybatis.xml
        mybatis.type-aliases-package=com.pm.boot.entity
        这样配置的数据库连接这些有问题没有呢?测试的端口也是写的9990,还是报错404
        hyrijk:没关系的。注意代码写好之后是否重启了、postman 的请求方式是否选对(这里是 POST 请求)
      • Donething:谢谢博主,这篇是生成用户Token的部分,还有没有用户身份认证部分的教程啊?
        Donething:谢谢博主~~
        hyrijk:http://www.jianshu.com/p/97362fdf039e
      • 阿喜来了:有用哎 谢谢你
      • 曹真:好文

      本文标题:spring boot、mybatis 实现用户登录接口

      本文链接:https://www.haomeiwen.com/subject/innsittx.html