spring boot挂疆、mybatis 實(shí)現(xiàn)用戶(hù)登錄接口

上次寫(xiě)了用戶(hù)注冊(cè)接口的實(shí)現(xiàn)缤言,接著寫(xiě)登錄接口

傳統(tǒng)的登錄驗(yàn)證方式是 session + cookie 的形式,這種驗(yàn)證方式不太適用于只提供 restful api 的后端系統(tǒng)胆萧,所以選擇了 基于 token 的驗(yàn)證方式跌穗。

token 是個(gè)長(zhǎng)字符串,客戶(hù)端向服務(wù)器申請(qǐng)锈拨。在需要登錄的請(qǐng)求中每次都攜帶上申請(qǐng)到的token羹唠,服務(wù)器端驗(yàn)證 token 的有效性,只有驗(yàn)證通過(guò)了才允許訪問(wèn)缝彬。具體怎么驗(yàn)證 token 下次再寫(xiě),先來(lái)看看怎么生成 token杆怕。

我使用了JWT 形式的 token壳贪, 關(guān)于 JWT(JSON Web Token)违施,可以看看下面兩篇文章

  1. JSON Web Token - 在Web應(yīng)用間安全地傳遞信息
  2. 八幅漫畫(huà)理解使用JSON Web Token設(shè)計(jì)單點(diǎn)登錄系統(tǒng)

對(duì)比上次的目錄結(jié)構(gòu)磕蒲,多了 AuthenticationApi.java 和 AuthenticationService.java 兩個(gè)文件


目錄結(jié)構(gòu)

添加 JWT 依賴(lài)

jwt 的 java 實(shí)現(xiàn)由很多,經(jīng)過(guò)對(duì)比兔院,選擇了下面這個(gè)坊萝。 在 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", "用戶(hù)不存在");
        } 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())      // 將用戶(hù)提交的密碼轉(zhuǎn)換為 hash
                .equals(userInDataBase.getPassword()); // 數(shù)據(jù)庫(kù)中的 password 已經(jīng)是 hash惦积,不用轉(zhuǎn)換
    }

測(cè)試

為了方便狮崩,使用 postman 這個(gè)程序來(lái)測(cè)試厉亏。

  • 先添加一個(gè)用戶(hù)


    添加用戶(hù)

    從返回的 Body 那里烈和,可以看到創(chuàng)建用戶(hù)成功。

  • 正常登陸


    登陸成功
  • 用戶(hù)不存在時(shí)


    用戶(hù)不存在
  • 密碼錯(cuò)誤時(shí)


    密碼錯(cuò)誤

查看項(xiàng)目完整代碼

項(xiàng)目地址: https://github.com/hyrijk/spring-boot-blog
克隆項(xiàng)目到本地

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

checkout 到當(dāng)前版本

git checkout 201c830d765d00014394563169b21bc1eb6c2a37

完。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末训柴,一起剝皮案震驚了整個(gè)濱河市幻馁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膘滨,老刑警劉巖火邓,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件德撬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡纤勒,警方通過(guò)查閱死者的電腦和手機(jī)踊东,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)刚操,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)菊霜,“玉大人济赎,你說(shuō)我怎么就攤上這事∷狙担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)统扳。 經(jīng)常有香客問(wèn)我畅姊,道長(zhǎng)若未,這世上最難降的妖魔是什么倾鲫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任乌昔,我火速辦了婚禮,結(jié)果婚禮上甚淡,老公的妹妹穿的比我還像新娘贯卦。我一直安慰自己丛晌,他們只是感情好辙芍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布故硅。 她就那樣靜靜地躺著,像睡著了一般往踢。 火紅的嫁衣襯著肌膚如雪徘层。 梳的紋絲不亂的頭發(fā)上趣效,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天跷敬,我揣著相機(jī)與錄音,去河邊找鬼妄帘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鬼廓,可吹牛的內(nèi)容都是我干的致盟。 我是一名探鬼主播馏锡,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼匪煌!你這毒婦竟也來(lái)了萎庭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤驳规,失蹤者是張志新(化名)和其女友劉穎署海,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體砸狞,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贯底,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撒强。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笙什,死狀恐怖飘哨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情琐凭,我是刑警寧澤芽隆,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響胚吁,放射性物質(zhì)發(fā)生泄漏牙躺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一腕扶、第九天 我趴在偏房一處隱蔽的房頂上張望孽拷。 院中可真熱鬧,春花似錦半抱、人聲如沸炼幔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抬吟。三九已至,卻和暖如春钙畔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背揍魂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工庄蹋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虫蝶,地道東北人能真。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓秦躯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子载荔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)肢娘,斷路器橱健,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 構(gòu)建用戶(hù)管理微服務(wù)翻譯自:https://springuni.com 構(gòu)建用戶(hù)管理微服務(wù)(一):定義領(lǐng)域模型和 R...
    極樂(lè)君閱讀 1,526評(píng)論 0 10
  • 在分布式環(huán)境中亮隙,如何支持PC、APP(ios促王、android)等多端的會(huì)話(huà)共享,這也是所有公司都需要的解決方案迅耘,用...
    安琪拉_4b7e閱讀 1,730評(píng)論 2 7
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評(píng)論 6 342
  • 今天聽(tīng)的課叫做愛(ài)與規(guī)則簇捍。 愛(ài)孩子,我一直覺(jué)得再容易不過(guò)的梯投。愛(ài),之于呼吸么鹤;那是生命跳動(dòng)的力量棠耕∧拢可是如何去愛(ài)蕊退,如何讓愛(ài)...
    萌奶糖閱讀 778評(píng)論 0 2