首页 >资讯 > > 正文

Spring Boot的安全配置(三)_观点

腾讯云 2023-04-07 02:09:09

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未经授权的错误。

上一篇:索辰科技: 索辰科技首次公开发行股票并在科创板上市网上发行申购情况及中签率公告 每日速看 下一篇:最后一页
x
推荐阅读

Spring Boot的安全配置(三)_观点

2023-04-07

索辰科技: 索辰科技首次公开发行股票并在科创板上市网上发行申购情况及中签率公告 每日速看

2023-04-06

北汽集团 深度绑定奔驰之后 未来何去何从? 今头条

2023-04-06

手汗就够多了!PS5手柄温度反馈专利遭网友吐槽

2023-04-06

天天热资讯!原料价格腰斩,产业大洗牌,为啥锂企纷纷被调高目标价?

2023-04-06

古代数学著作(中国古代重要的数学著作有哪些?)

2023-04-06

逆势加码房地产!宁波银行能成为银行业的可口可乐吗?

2023-04-06

新视角!安庆白癜风医院哪有【重点突出】什么是疑难型白癜风?-环球速递

2023-04-06

每日热门:包头一独栋老楼迎来“蝶变”

2023-04-06

天天即时:我爱我家:五八有限公司拟减持不超2.74%股份,持股将低于5%

2023-04-06

女尊男卑每天含着玉势_女尊男卑玉势惩罚文

2023-04-06

现代电子技术的主要特征(什么是现代电子技术)|焦点热讯

2023-04-06

湘潭大学党委书记刘起军调研公共管理学院_全球看热讯

2023-04-06

今日播报!“最短”清明假期 祭扫平稳有序

2023-04-06

美国51区惊现神秘飞行物!是美军的六代机NGAD,还是高性能技术验证机? 快资讯

2023-04-06

杭州一男子坐地铁自带沙发只因每次都抢不到座位 天天播报

2023-04-06

当前时讯:申请公租房需要多久才能批下来(申请公租房需要多长时间能申请下来)

2023-04-06

搞笑的老丈人礼物 微头条

2023-04-06

热议:2022车险为什么比去年贵,保险折扣少了

2023-04-06

应天诗钞-即时焦点

2023-04-06

货车超载屡教不改,公司法人一同被罚 世界热消息

2023-04-05

足球速览 中甲石家庄功夫官方前黑龙江中场核心卜鑫加盟球队

2023-04-05

辽宁一渔船在渤海北部盘锦港区失踪,共有3人失联|热门看点

2023-04-05

员工痛批领导安排加班,真正的原因不在“加班”

2023-04-05

新一波降薪、裁员潮……百年老字号也没了余粮

2023-04-05

美国前总统特朗普:指控是政治迫害 应立即撤销 天天视讯

2023-04-05

“英雄回家,英雄回家!” 每日热点

2023-04-05

一季度消费市场稳步恢复

2023-04-05

中央气象台:华南有强降水 冷空气将影响北方地区

2023-04-05

即时焦点:陈金皓4.5机构介入黄金再次洗盘;今日黄金原油最新行情策略分析及独家操作建议指导

2023-04-05

【天天播资讯】妇女节送妈妈什么礼品郝

2023-04-05

快讯:比奥德赛帅气,每公里仅4毛钱

2023-04-05

「怡球资源股票」股市又现吸引力?二季度以来77股翻倍,基金大佬接连“奔私”

2023-04-05

往常的近义词是往昔吗(往常的近义词) 环球新消息

2023-04-04

DC《蓝甲虫》预告上线,粉丝:这不就是钢铁侠+蜘蛛侠+绿灯侠吗?-今日聚焦

2023-04-04

快消息!绍兴一男子醉酒跳河,民警火速跳下水塘

2023-04-04

每日时讯!鸿海创始人郭台铭结束美国行 明日将发表工作计划报告

2023-04-04

全球即时看!04.04成交量继续放大

2023-04-04

当前视点!云从科技(688327)龙虎榜数据(04-04)

2023-04-04

百余名驻澳门部队官兵无偿献血

2023-04-04

今日热文:西媒:欧洲正经历“动荡的春天”

2023-04-04

股票进仓是什么意思_天天头条

2023-04-04

今日精选:NCAA全美锦标赛最佳阵容:冠军队三人入选 黑马绝杀功臣在列

2023-04-04

冰岛没有蚊子怎么办_冰岛没有蚊子

2023-04-04

中国对外贸易中心:本届广交会将对境内采购商全面开放_全球快看点

2023-04-04

世界最资讯丨特朗普即将接受传讯纽约严阵以待 拜登:不担心骚乱

2023-04-04

将道德失范与法律惩戒挂钩规范配娱行业-每日热闻

2023-04-04

看好股市结构性机会,A股五大上市险企谋划增配高股息股票|精选

2023-04-04

亚洲开发银行预计今年中国经济增长5%,高于其他亚洲发展中经济体-环球速看料

2023-04-04

王毅会见菲律宾前总统阿罗约

2023-04-04

“张继科”刷屏,中央政法委发声! 天天报资讯

2023-04-04

好听的网络名字女生简单_好听的网络名字女生_环球快看

2023-04-04

世界新动态:特斯拉推出充电新品赛博充Cybervault 售价5500元

2023-04-03

微信电脑如何截屏快捷键_微信怎么截屏电脑快捷键_全球通讯

2023-04-03

查清楚数明白,保护母亲河(美丽中国)|每日快报

2023-04-03

天天精选!俄媒:俄国防部称,俄罗斯空降兵部队首次接收重型喷火系统

2023-04-03

同方股份:知网ocr识别和智能客服技术是自研的,目前已形成产品

2023-04-03

全球要闻:小米汽车Ms11全面曝光:续航1036公里,零百加速3.6秒,29.99万元起

2023-04-03

凯德投资任命中国首席投资官,强化投资能力、加速业务增长

2023-04-03

【世界热闻】源飞宠物(001222)4月3日主力资金净卖出73.56万元

2023-04-03

湖南中医药大学一门课程入选教育部首批普通高校本科教育课程思政示范培训课程

2023-04-03

客厅水晶灯坏了怎么修_水晶灯客厅 最新消息

2023-04-03

焦点简讯:荆楚网《名医话健康》第29期:头晕头痛不可忽视

2023-04-03

内江多举措激发民间资本投资活力

2023-04-03

巨头企业总裁夫人宴请阔太!黎姿坐角落,伏明霞婚姻风波后首露面

2023-04-03

每日信息:美联储是否再加息存在不确定性 美前财长:宣布金融动荡结束还为时过早

2023-04-03

太火爆!成都这场演出一票难求 首次在舞台上加座-全球短讯

2023-04-03

环球即时:“颜值”增了 “内涵”提了

2023-04-03

每日看点!党建引领实现文明实践全域全覆盖 大鹏新区以创新举措持续深化文明城市创建

2023-04-03

理想汽车2023年3月交付20823辆

2023-04-01

【天天热闻】拉卡泽特:姆巴佩是最好的之一,希望他周日面对里昂发挥平淡一些

2023-04-01

记者赵宇:过去一周杜兆才没有出现在足协办公楼_天天快播

2023-04-01

搭建“渡桥”助金种子跨越“深谷” ——湖北中试平台加速推进科技成果入市_全球今日讯

2023-04-01

环球热门:基金调研丨诺德基金调研柳药集团

2023-04-01

制造业PMI连续三月位于扩张区间 建筑业持续高景气-今日报

2023-04-01

百事通!邮报:埃弗顿处罚结果可能赛季结束前确定,球队面临扣分风险

2023-04-01

周黑鸭(01458)发布2022年度业绩 营收23.4亿元 现金流表现强劲

2023-03-31

甘肃成县:忠“橙”守护,只为绿意满青山

2023-03-31

忙碌的早晨作文400个字(忙碌的早晨作文)|环球速看

2023-03-31

毫米波雷达三维动画如何进行制作 每日快看

2023-03-31

【全球独家】晋中税务:“青力青为”争做追“锋”者

2023-03-31

股东户数最新变动:珠江股份(600684)股东户数4.05万户,较上期减少3.52%

2023-03-31

上海长宁:加速布局未来赛道 以科技赋能产业发展|世界观天下

2023-03-31

快讯:《百川狂想曲》大型尴尬瞬间 薛之谦火星狂想败于脑瓜崩

2023-03-31

3月31日15时湖北黄冈疫情最新消息今天 3月31日15时湖北黄冈新增确诊人数

2023-03-31

离婚时不要孩子抚养权的妈妈,多半有以下两方面的考虑,很明智 环球热议

2023-03-31

世界要闻:3月31日12时安徽宣城今日疫情数据及宣城疫情最新通报今天感染人数

2023-03-31

白酒板块午盘拉升 贵州茅台股价涨幅1.33% 环球滚动

2023-03-31

北约在俄周边地区持续举行军演

2023-03-31

日本福岛第一核电站发现新受损痕迹 强推核污染水排海计划引发批评-每日热文

2023-03-31

爱德华·卢斯:美国需要的是“南方方案”,而不是“民主峰会”

2023-03-31

头条焦点:又有一批私募基金管理人被监管“清退”

2023-03-31

新股消息丨永联丰控股(08617)申请创业板转主板上市 为华南最大的回转支承制造商

2023-03-31

修奈泽尔壁纸_修奈泽尔

2023-03-31

他的唱功一直很好!王心凌聊周深实力层次,他的现场很稳! 天天热推荐

2023-03-31

前沿资讯!卤素是什么晶体结构_卤素是什么晶体

2023-03-30

全球新动态:魅族20系列价格公布:2999元起、无界顶配8499元!

2023-03-30

狗狗吐黄水带泡沫_狗狗吐黄水怎么回事

2023-03-30

好听的抖音歌曲2022_好听的抖音歌曲

2023-03-30

视频号暗推五大动作 发力直播电商和本地生活服务

2023-03-30