16.登錄接口認(rèn)證測(cè)試

1.Swagger添加token認(rèn)證參數(shù)

修改swagger配置類

package com.lvxk.demo.admin.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

/**
 * SwaggerConfig
 * Description: <br/>
 * date: 2020/5/5 8:02<br/>
 *
 * @author lvxk<br />
 * @since JDK 1.8
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        // 添加請(qǐng)求參數(shù),我們這里把token作為請(qǐng)求頭部參數(shù)傳入后端
        ParameterBuilder parameterBuilder = new ParameterBuilder();
        List<Parameter> parameters = new ArrayList<Parameter>();
        parameterBuilder.name("token").description("令牌")
                .modelRef(new ModelRef("string")).parameterType("header").required(false).build();
        parameters.add(parameterBuilder.build());
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.lvxk.demo.admin.controller"))
                .paths(PathSelectors.any())
                .build().globalOperationParameters(parameters);
    }
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("小凱 - demo測(cè)試接口")
                .description("小凱 - demo測(cè)試接口")
                .termsOfServiceUrl("http://localhost:8081/swagger-ui.html")
                .contact(new Contact("xiaokai.lv", "http://localhost:8071/swagger-ui.html", "lvxiaokai@aliyun.com"))
                .version("1.0")
                .build();
    }
}

2.這時(shí)候在不登陸的情況下是無(wú)法訪問(wèn)接口的

image.png

3.編寫(xiě)登錄接口 生成token

package com.lvxk.demo.admin.controller;

import com.demo.core.http.HttpResult;
import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.Producer;
import com.lvxk.demo.admin.model.SysUser;
import com.lvxk.demo.admin.security.JwtAuthenticatioToken;
import com.lvxk.demo.admin.service.SysUserService;
import com.lvxk.demo.admin.util.SecurityUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.web.bind.annotation.*;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;

/**
 * SysLoginController 獲取驗(yàn)證碼
 * Description: <br/>
 * date: 2020/5/5 15:19<br/>
 *
 * @author lvxk<br />
 * @since JDK 1.8
 */
@RestController
@RequestMapping("login")
@Api(tags = "登錄相關(guān)")
public class SysLoginController {

    @Autowired
    private Producer producer;

    @Autowired
    private SysUserService sysUserService;

    @Autowired
    private AuthenticationManager authenticationManager;

    @GetMapping("kaptcha")
    @ApiOperation(value = "獲取驗(yàn)證碼(5位)")
    public void captha(HttpServletResponse response, HttpServletRequest request) throws IOException {
        response.setHeader("Cache-Control","no-store,no-cache");
        response.setContentType("image/jpeg");
        //生成文字驗(yàn)證碼
        String text = producer.createText();
        //生成圖片驗(yàn)證碼
        BufferedImage image = producer.createImage(text);
        //保存驗(yàn)證碼到session中
        request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY,text);
        ServletOutputStream out = response.getOutputStream();
        ImageIO.write(image,"jpg",out);
        IOUtils.closeQuietly(out);
    }

    /**
     * 登錄接口
     */
    @PostMapping(value = "/login")
    public HttpResult login(@RequestBody LoginBean loginBean, HttpServletRequest request) throws IOException {
        String username = loginBean.getAccount();
        String password = loginBean.getPassword();
        String captcha = loginBean.getCaptcha();
        // 從session中獲取之前保存的驗(yàn)證碼跟前臺(tái)傳來(lái)的驗(yàn)證碼進(jìn)行匹配
        Object kaptcha = request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
        if(kaptcha == null){
            return HttpResult.error("驗(yàn)證碼已失效");
        }
        if(!captcha.equals(kaptcha)){
            return HttpResult.error("驗(yàn)證碼不正確");
        }
        // 用戶信息
        SysUser user = sysUserService.findByName(username);
        // 賬號(hào)不存在、密碼錯(cuò)誤
        if (user == null) {
            return HttpResult.error("賬號(hào)不存在");
        }
        if (!PasswordUtils.matches(user.getSalt(), password, user.getPassword())) {
            return HttpResult.error("密碼不正確");
        }
        // 賬號(hào)鎖定
        if (user.getStatus() == 0) {
            return HttpResult.error("賬號(hào)已被鎖定,請(qǐng)聯(lián)系管理員");
        }
        // 系統(tǒng)登錄認(rèn)證
        JwtAuthenticatioToken token = SecurityUtils.login(request, username, password, authenticationManager);
        return HttpResult.ok(token);
    }

}

4.LoginBean

package com.lvxk.demo.admin.vo;

import lombok.Data;

/**
 * 登錄接口封裝對(duì)象
 * Description: <br/>
 * date: 2020/5/5 16:42<br/>
 *
 * @author lvxk<br />
 * @since JDK 1.8
 */
@Data
public class LoginBean {

    private String account;
    private String password;
    private String captcha;
}

5.PasswordUtils

package com.lvxk.demo.admin.util;
import java.util.UUID;
/**
 * 密碼工具類
 * Description: <br/>
 * date: 2020/5/5 16:44<br/>
 *
 * @author lvxk<br />
 * @since JDK 1.8
 */
public class PasswordUtils {
    /**
     * 匹配密碼
     * @param salt 鹽
     * @param rawPass 明文
     * @param encPass 密文
     * @return
     */
    public static boolean matches(String salt, String rawPass, String encPass) {
        return new PasswordEncoder(salt).matches(encPass, rawPass);
    }

    /**
     * 明文密碼加密
     * @param rawPass 明文
     * @param salt
     * @return
     */
    public static String encode(String rawPass, String salt) {
        return new PasswordEncoder(salt).encode(rawPass);
    }

    /**
     * 獲取加密鹽
     * @return
     */
    public static String getSalt() {
        return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 20);
    }
}

經(jīng)過(guò)測(cè)試登錄成功后用token即可正常訪問(wèn)接口

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市毫胜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惯悠,老刑警劉巖躬络,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜡吧,死亡現(xiàn)場(chǎng)離奇詭異休傍,居然都是意外死亡再沧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門尊残,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人淤堵,你說(shuō)我怎么就攤上這事寝衫。” “怎么了拐邪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵慰毅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我扎阶,道長(zhǎng)汹胃,這世上最難降的妖魔是什么婶芭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮着饥,結(jié)果婚禮上犀农,老公的妹妹穿的比我還像新娘。我一直安慰自己宰掉,他們只是感情好呵哨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著轨奄,像睡著了一般孟害。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挪拟,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天挨务,我揣著相機(jī)與錄音,去河邊找鬼玉组。 笑死谎柄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的球切。 我是一名探鬼主播谷誓,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吨凑!你這毒婦竟也來(lái)了捍歪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸵钝,失蹤者是張志新(化名)和其女友劉穎糙臼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體恩商,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡变逃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怠堪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揽乱。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖粟矿,靈堂內(nèi)的尸體忽然破棺而出凰棉,到底是詐尸還是另有隱情,我是刑警寧澤陌粹,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布撒犀,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏或舞。R本人自食惡果不足惜荆姆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望映凳。 院中可真熱鬧胆筒,春花似錦、人聲如沸魏宽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)队询。三九已至派桩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚌斩,已是汗流浹背铆惑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留送膳,地道東北人员魏。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叠聋,于是被迫代替她去往敵國(guó)和親撕阎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348