您的位置:首页 >资讯 > 热点 >

Spring Boot的安全配置(三) 每日讯息

2023-04-07 15:26:07    来源:腾讯云

JWT

JWT(JSON Web Token)是一种用于在网络中传输安全信息的开放标准(RFC 7519)。它可以在各个服务之间安全地传递用户认证信息,因为它使用数字签名来验证信息的真实性和完整性。

JWT有三个部分,每个部分用点(.)分隔:

Header:通常包含JWT使用的签名算法和令牌类型。Payload:包含有关用户或其他主题的声明信息。声明是有关实体(通常是用户)和其他数据的JSON对象。声明被编码为JSON,然后使用Base64 URL编码。Signature:用于验证消息是否未被篡改并且来自预期的发送者。签名由使用Header中指定的算法和秘钥对Header和Payload进行加密产生。

在Spring Boot中,您可以使用Spring Security和jjwt库来实现JWT的认证和授权。下面是一个使用JWT的示例:


(相关资料图)

@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter {    @Value("${jwt.secret}")    private String jwtSecret;    @Override    protected void configure(HttpSecurity http) throws Exception {        http.csrf().disable()            .authorizeRequests()            .antMatchers(HttpMethod.POST, "/api/authenticate").permitAll()            .anyRequest().authenticated()            .and()            .addFilter(new JwtAuthenticationFilter(authenticationManager(), jwtSecret))            .addFilter(new JwtAuthorizationFilter(authenticationManager(), jwtSecret))            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);    }    @Override    public void configure(AuthenticationManagerBuilder auth) throws Exception {        auth.authenticationProvider(new JwtAuthenticationProvider(jwtSecret));    }}

在上面的示例中,SecurityConfig类继承了WebSecurityConfigurerAdapter并使用了@EnableWebSecurity注解启用Spring Security。configure()方法使用HttpSecurity对象来配置HTTP请求的安全性。.csrf().disable()禁用了CSRF保护。.authorizeRequests()表示进行授权请求。.antMatchers(HttpMethod.POST, "/api/authenticate").permitAll()表示允许POST请求到/api/authenticate路径。.anyRequest().authenticated()表示要求所有其他请求都需要身份验证。.addFilter(new JwtAuthenticationFilter(authenticationManager(), jwtSecret)).addFilter(new JwtAuthorizationFilter(authenticationManager(), jwtSecret))分别添加JWT认证和授权过滤器。.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)指定了会话管理策略。

configure()方法中还有一个configure(AuthenticationManagerBuilder auth)方法,它使用JwtAuthenticationProvider类配置身份验证。在这里,jwtSecret被注入到JwtAuthenticationProvider构造函数中,以便在认证过程中使用。

下面是JwtAuthenticationFilterJwtAuthorizationFilter的实现:

public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {    private final AuthenticationManager authenticationManager;    private final String jwtSecret;    public JwtAuthenticationFilter(AuthenticationManager authenticationManager, String jwtSecret) {        this.authenticationManager = authenticationManager;        this.jwtSecret = jwtSecret;        setFilterProcessesUrl("/api/authenticate");    }    @Override    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) {        try {            LoginRequest loginRequest = new ObjectMapper().readValue(request.getInputStream(), LoginRequest.class);            Authentication authentication = new UsernamePasswordAuthenticationToken(                    loginRequest.getUsername(),                    loginRequest.getPassword()            );            return authenticationManager.authenticate(authentication);        } catch (IOException e) {            throw new RuntimeException(e);        }    }    @Override    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) {        UserPrincipal userPrincipal = (UserPrincipal) authResult.getPrincipal();        String token = Jwts.builder()                .setSubject(userPrincipal.getUsername())                .setIssuedAt(new Date())                .setExpiration(new Date(System.currentTimeMillis() + 864000000))                .signWith(SignatureAlgorithm.HS512, jwtSecret)                .compact();        response.addHeader("Authorization", "Bearer " + token);    }}

JwtAuthenticationFilter类继承了UsernamePasswordAuthenticationFilter类,它用于处理基于用户名和密码的身份验证。它还使用AuthenticationManager来验证用户名和密码是否正确。jwtSecret在构造函数中被注入,用于生成JWT令牌。

attemptAuthentication()方法中,LoginRequest对象被反序列化为从请求中获取的用户名和密码。这些值被封装到UsernamePasswordAuthenticationToken中,并传递给AuthenticationManager以验证用户身份。

在身份验证成功后,successfulAuthentication()方法被调用。在这里,UserPrincipal对象被从Authentication对象中获取,然后使用Jwts类生成JWT令牌。setSubject()方法将用户名设置为JWT主题。setIssuedAt()方法设置JWT令牌的发行时间。setExpiration()方法设置JWT令牌的到期时间。signWith()方法使用HS512算法和jwtSecret密钥对JWT令牌进行签名。最后,JWT令牌被添加到响应标头中。

下面是JwtAuthorizationFilter的实现:

public class JwtAuthorizationFilter extends BasicAuthenticationFilter {    private final String jwtSecret;    public JwtAuthorizationFilter(AuthenticationManager authenticationManager, String jwtSecret) {        super(authenticationManager);        this.jwtSecret = jwtSecret;    }    @Override    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {        String authorizationHeader = request.getHeader("Authorization");        if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) {            chain.doFilter(request, response);            return;        }        String token = authorizationHeader.replace("Bearer ", "");        try {            Jws claimsJws = Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token);            String username = claimsJws.getBody().getSubject();            List authorities = (List) claimsJws.getBody().get("authorities");            List grantedAuthorities = authorities.stream()                    .map(SimpleGrantedAuthority::new)                    .collect(Collectors.toList());            Authentication authentication = new UsernamePasswordAuthenticationToken(username, null, grantedAuthorities);            SecurityContextHolder.getContext().setAuthentication(authentication);            chain.doFilter(request, response);        } catch (JwtException e) {            response.setStatus(HttpStatus.UNAUTHORIZED.value());        }    }}

JwtAuthorizationFilter类继承了BasicAuthenticationFilter类,并覆盖了doFilterInternal()方法。在这个方法中,请求头中的Authorization标头被解析,如果它不是以Bearer开头,则直接传递给过滤器链。否则,从令牌中解析出主题(用户名)和授权信息,然后创建一个包含用户身份验证和授权信息的Authentication对象,并将其设置到SecurityContextHolder中。

如果JWT令牌无效,JwtException将被抛出,并返回HTTP 401未经授权的错误。

标签:

相关阅读

精彩放送

苏泊尔2022年度净利同比增6.36% 拟10派30.3元

马桶堵了如何自己快速疏通?直冲式马桶与虹吸式马桶哪种好?

哪里有卖茶杯犬?茶杯犬寿命一般是多长时间?

什么是雀斑?女性脸上长雀斑原因有哪些? 微速讯

焦点速看:中信证券:国内光模块龙头将有较大估值弹性 预测市盈率有望达50-60倍区间

天津适合摄影的景点有哪些?美丽天津摄影大赛采风

信阳市水利局:科学应对强降雨过程 全力做好民生水利保障_每日热点

价格战殃及保值率 3月二手车预计成交145万辆

世界速读:老胡同重生 传统现代融合共存

即时焦点:2023年4月6日天津市菠菜批发价格行情

公司揭示的OnePlus Nord相机秘密 当前讯息

今日热文:4月6日基金净值:鹏扬景沣六个月持有期混合A最新净值1.1071,跌0.01%

2023纽约车展:新款Jeep牧马人首发亮相,越野气息浓厚_最资讯

全球今头条!人社部部署开展2023年高校毕业生等青年就业创业推进计划

记者观察:“水淹七军”地 文旅热潮起

环球即时看!李弈善:黄金2020空大跌,晚间2000上可先多一次!

天天观热点:NBA新排名!76人存悬念,湖人看人脸色,快船主动,勇士2队无退路

【世界热闻】轩锋—黄金原油空单获利,跟上!!!

税收大数据显示:中国经济运行态势逐步回升向好|世界滚动

“券商一哥”,突遭警示!-播资讯

世界速递!冯哥论金:黄金探底修正,将走二次上涨

万锦晟4.6黄金非农日停盘,下周黄金或将逼空见顶!-环球热头条

每日讯息!多年牛市将到来!市场人士:黄金和比特币处于新周期的早期阶段

售价10.28-10.98万元 比亚迪2023款e2正式上市

中国旅游市场迎一季度“开门红”

全球百事通!图灵波浪4.6晚-白银调整结束,或再出新高无

国家税务总局:今年一季度经济运行情况呈现“六个逐步向好”态势

郑氏点银:黄金强势修正回踩仍看涨,原油高位横盘压制延续回调|环球微头条

黄金2000美元上方盘整!技术面新信号:守住这一支撑仍有良好买盘_环球速读

天天关注:国家税务总局:2022年税费优惠政策累计惠及超过8000万经营主体

国家税务总局:预计全年为经营主体减轻税费负担超1.8万亿元

张含韵爆肥认不出!大象腿被指撞脸何洁,唱歌上气不接下气 今日热闻

近1个亿的杭州院子上架法拍 豪宅背后却牵扯62亿特大套路贷案

头狼:黄金2021现价空|观热点

牛肉饺子馅的做法和配料_饺子馅儿的九种做法-焦点速看

中国足球协会:取消7家足球俱乐部注册资格|世界热闻

突发重锤!两家券商同日被罚 监管列数“六宗罪”!涉及4名保代 发生了什么?

孔明灯图片简笔画彩色_孔明灯图片简笔画|最资讯

羊肚菌奏响春日“丰收曲” ——记元氏县致富带头人仝夕红

一颗红心投篮是什么成语啊?投篮精彩瞬间的动作描写有哪些?

24家投行预测3月非农:增速料进一步放缓,有望提振金价继续上扬_环球最资讯

我国科学家开发首例温和条件下超快氢负离子导体

今日讯!何小冰:黄金三线合一是多头的防守,原油守高再探低 04.06

王导:全网公开黄金2010多获利中,继续看涨

今日热文:当烟火气遇上文艺范 邂逅春天里的“诗与远方”

全国首个“一带一路”人才发展软基建项目贵阳白云区揭牌

中国驻意大利使馆再次提醒旅意中国公民谨防电信诈骗|焦点速讯

唛王是什么意思如何解释?唛怎么读拼音是什么?

焦点速读:新华视点丨“我老了,你的青春却定格了!”

天天要闻:李弈善:非农前2022下继续空,原油料以震荡收尾!

环球快消息!足协取消武汉长江等俱乐部注册资格 具体详细内容是什么

环球观焦点:外汇界新一:叫板黄金的代价终归还是来了

有名的钢琴曲有哪些?最有名的钢琴曲排行榜一览?

英雄杀商鞅变法怎么用?英雄杀商鞅技能说明?

山海关在哪个省的什么位置?山海关资料介绍?

国手是什么意思?“杏林国手”即指什么?

广州蓝天技工学校怎么样?广州蓝天技工学校资料介绍? 天天热讯

天天看点:上海的文化特色是什么?上海文化有哪些特点?

木瓜奇迹召唤师怎么加点?木瓜奇迹召唤师加点攻略?

创业板b代码是多少?创业板资料介绍?

世界即时:segment是什么意思?segment有几层含义?

偶像活动歌曲有哪些?偶像活动歌曲大全?-全球即时看

“红利”又来了 今年税费优惠政策将减轻税费超1.8万亿元

全球报道:解放军镇江船艇学院是几本?解放军镇江船艇学院资料介绍?

三星s5660上市价格是多少?三星s5570报价介绍? 环球新要闻

报道:dosbox怎么使用?dosbox使用方法介绍?

环球资讯:封狼居胥是什么意思?狼居胥山现在指的是什么地方?

sakura是什么意思如何解释?其他日语常用语中文谐音是什么?

河南财经政法大学一本和二本有什么区别?具体区别介绍?

蕲这个字怎么读?蕲这个字是什么意思?

孙思邈《千金方》介绍?孙思邈的千金方的具体内容是什么?

TZ是什么含义如何解释?买房子tz暗指是什么意思?

“雪龙2”号顺利回家 第39次南极考察队全部返回国内基地码头-环球百事通

浴缸十大品牌是什么?浴缸品牌排行榜一览?-环球通讯

一季度全国新办涉税经营主体343.4万户 同比增长7.2%|环球今头条

传奇赤月老巢地图怎么走?赤月恶魔老巢的路线介绍?|全球速读

全球焦点!财政供养人员怎么界定?财政供养是什么概念?

SHMS校长应邀拜访华东师范大学并发表主题演讲“款待业永不落幕”

何润东演的电影有哪些?何润东黄子韬演的电影叫什么?

好听的韩文歌曲有哪些?韩国十大经典老歌推荐

MacBook Pro将在2026年升级OLED屏幕 由三星显示供应_全球焦点

官宣!中超新霸主已敲定6大王牌新援加盟,未来或在亚冠扬威

阿布扎比文化与旅游部拜访200余家中国旅业伙伴,欢迎中国游客探索阿布扎比

2023年QS学科排名发布:SHMS蝉联全球第三,SEG四校均进入全球前八

音为有爱 陪伴常在——慕思股份沙发品牌321陪伴计划圆满收官

盘点李湘的综艺节目有哪些?李湘赵丽颖那个节目叫什么?

多头等待新的催化剂!白银日内交易分析:只要守住关键支撑 银价料再大涨逾2%|世界快报

中亚地区航空运力快速复苏,未来增长潜力不容小觑|当前短讯

英雄之光|他曾说会骑马归来,但回来的只有一张三等功喜报…… 资讯推荐

【文明旅游】路上千般景,最美是文明 焦点快播

电脑静音快捷键在哪里?电脑静音快捷键有哪些功能?

天天观察:万圣节快乐用英语怎么说?万圣节快乐英语表达方式?

每日资讯:台湾明道大学是公立还是私立?中国台湾明道大学介绍?

焦点速递!魔兽世界橙杖任务怎么完成?魔兽世界橙杖任务流程有哪些?

12月14日流星雨在哪个方向?12月14日流星雨资料介绍?

万元增加值能耗怎么计算?万元产值能耗计算公式?

冒险岛双弩精灵有哪些技能?冒险岛双弩精灵技能介绍?

天天热点评!哈尔滨专科学校有哪些?哈尔滨专科学校前十名有哪些?

【当前独家】6月份有哪些节日?6月份节日大全?

黄页是什么?黄页来源于哪里? 全球看热讯

广州远赢科技有限公司并非骗子:做互联网行业就要敢于创新

全国春灌全面展开 灌溉面积超1.2亿亩

李生论金:黄金多头峰回路转,等待非农助一臂之力

焦点消息!方萍萍:黄金2007一线再次出现多头回调买入信号

财务自由必须拥有的4种收入_时讯

世界焦点!阿东说金:高十字出顶,静候大空来袭

* 金山云港股盘中跌超8%,财报显示全年营收首次出现下滑-当前观察

陈阿牛:黄金15-16做空;日内做空等待