魅族PANDAER 67W GaN电源适配器开售:搭载超感稳连技术2.0,219
IT之家4月7日消息,魅族PANDAER67WGaN电源适配器今日正式开售,共有时速站台以及银色列车两种配色可选,售价为219元。IT之家从
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
构造函数中,以便在认证过程中使用。
下面是JwtAuthenticationFilter
和JwtAuthorizationFilter
的实现:
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未经授权的错误。
关键词:
IT之家4月7日消息,魅族PANDAER67WGaN电源适配器今日正式开售,共有时速站台以及银色列车两种配色可选,售价为219元。IT之家从
4月6日金东公安分局多湖派出所组织村警在辖区进行巡逻时发现草丛中疑似有罂粟花民警一边对植物进行辨认一边对附近住户进行走访
遗嘱通常是隐秘的。对一些人来说,它不亚于一块长期压抑在心头的大石,里面既有关于死亡的思虑,也有对身边人割舍不掉的情感羁绊。只有当它真
原标题:多项税收数据反映经济发展实现较好开局央视网消息(新闻联播):在国新办今天(4月6日)举行的“权威部门话开局”系列主题新闻发布会上,
绣墩实拍图。曾秉炎 摄品出古家具韵味文 曾秉炎收藏的领域很宽,一旦进入这个行列,就会有想法,有选择,有目标。时间久了,也
贵州人力资源和社会保障厅:贵州2023年二建报名下半年开启!由二级建造师考试栏目提供,查找更多贵州人力资源和社会保障厅:贵州2023年二建报名
财产保全一般是申请人请求的范围或者是和案件有关的财物,主要包括动产、不动产、股权、机器设备等。财产保全后一般是需要在法院作出裁决后才
从北京到广州,甲流肆虐一月余,奥司他韦为何还一药难求?
由易小星监制,马凯编剧、执导的惊悚喜剧电影《了不起的夜晚》正在全国热映中。影片以恰到好处的惊悚氛围为人所知,“惊”点与“笑”点在巧妙
分时图快速拉升意味此时存在大单买入,在大单的推动下,股价快速地上涨。截止发稿,朗特智能(300916)涨幅1%,成交量0 210万手,换手率0 81%
幻想日进斗金“躺着”赚钱,帮助电信网络犯罪人员接收诈骗资金并转移到指定账户,结果走上了犯罪歧途,沦为犯罪“工具人”。近日,经山东省莘
核心阅读对中职篮而言,这是渐入佳境的一个赛季,在常规赛第三阶段恢复主客场赛制之后,赛场竞争激烈,球迷观赛热情高涨。本土球
【来源:巴彦淖尔农牧局_地方信息】为做好地膜科学使用回收试点工作及中央生态环保督察整改任务,4月4日上午,由临河区耕地质量保护中心组织召
近日,国家发展改革委就业收入分配和消费司组织编写的《新型消费发展典型案例》由中国市场出版社出版发行。我市《爱菊粮油:“一
但是在神农投资陈宇看来,这次的AI行情是一次有意义的乱炒。科技股的泡沫,不是无谓的炒作,而是实现大梦想的前提与必须。只有全世界的人拎着
据悉,辽宁是环渤海地区的重要省份和东北地区对外开放的前沿,推进辽宁与京津冀协同发展,对推动京津冀和东北地区发展,特别是辽宁振兴具有重
”据此前报道,马克龙5日在法国驻华大使馆发表讲话,试图驳斥有关中西方之间紧张关系“不可避免地呈螺旋式上升”,将导致与中方切断联系的观点
良信股份接受调研时表示,2023年截至目前,公司订单及生产情况良好,经营稳健。地产行业的整体表现一定程度上受到宏观因素及行业政策的影响较
“金三银四”毕业季的当下,一个新的变化引起关注。日前,“北京硕博毕业生人数首超本科生”话题登上多个社交平台热搜。在毕业生
为进一步坚定党员理想信念,有效提高党员党性修养,丰富党员干部的精神文化生活,3月30日,宜宾市翠屏区水利局第四党支部前往李庄文化抗战博物
SpringBoot是一个非常流行的Java开发框架,提供了各种实用的功能和组件来快速构建应用程序。安全是任何Web应用程序开发的关键方面,因为它涉及
原标题:普京:立场不同,俄美关系处在深刻的危机之中据俄罗斯总统网站消息,当地时间5日,普京在克里姆林宫举行的接受新任外国
欧洲不锈钢市场第二季度复苏的希望正在消退;甘肃甬金年产22万吨精密不锈钢板带项目已完成项目一期1号厂建设。
4月6日,全球数字经济领导企业联想集团2023 24财年誓师大会在北京顺利启幕。联想集团(00992)执行副总裁、IDG智能设备业务集团总裁LucaRossi表
颠覆QS排名!这10所大学竟被英国人视为“造神”梦校?当选择英国的大学时,许多学生和家长通常会参考QS排名或者其他类似的排名指标。然而,对