Springsecurity 配置类
@Configuration @EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true) public class SecurityConfiguraton extends WebSecurityConfigurerAdapter { @Autowired UserDetailsService userDetailsService; @Autowired JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(password()); } @Bean PasswordEncoder password(){ return new BCryptPasswordEncoder(); } @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeHttpRequests() .antMatchers("/login").permitAll() .anyRequest().authenticated(); http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); } @Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } }
UserDetailsSeviceImpl 继承UserDetailsService 实现自定义根据用户名从数据库中查询用户信息,采用Mybatis-plus 框架来操作Mysql数据库,相关代码省略。
@Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired Mapper_login mapper_login; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { QueryWrapper<Login> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("username", username); Login login = mapper_login.selectOne(queryWrapper); System.out.println(login); if (Objects.isNull(login)) throw new UsernameNotFoundException("用户名不存在"); else { List<GrantedAuthority> auths= AuthorityUtils.commaSeparatedStringToAuthorityList(null); return new User(login.getUsername(), new BCryptPasswordEncoder().encode(login.getPassword()),auths); } } }
自定义JWT 过滤器
@Component public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { @Autowired RedisUtil redisUtil; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String token = request.getHeader("token"); if(!StringUtils.hasText(token)){ filterChain.doFilter(request,response); return; } DecodedJWT decodedJWT = JwtUtils.decodeToken(token); String username = decodedJWT.getClaim("username").asString(); User1 user1 = (User1)redisUtil.get(username); UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken=new UsernamePasswordAuthenticationToken(user1.getUsername(),user1.getPassword(),user1.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); System.out.println(SecurityContextHolder.getContext().getAuthentication().getPrincipal()); filterChain.doFilter(request,response); } }
后端登录接口
@RequestMapping("/login") @ResponseBody public Login login(Login login){ UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken=new UsernamePasswordAuthenticationToken(login.getUsername(),login.getPassword()); Authentication authenticate = authenticationManager.authenticate(usernamePasswordAuthenticationToken); if(Objects.isNull(authenticate)){ System.out.println("登录失败"); throw new RuntimeException("登录失败"); } User principal = (User)authenticate.getPrincipal(); System.out.println(principal); String username=principal.getUsername(); User1 user1=new User1(principal.getUsername(),null,principal.getAuthorities()); redisUtil.set(username,user1); Map<String,String> hashmap=new HashMap<>(); hashmap.put("username",username); String s = JwtUtils.generateToken(hashmap); System.out.println(s); login.setResult(s); return login; } }
ApiPost测试结果
番外篇
由于文字代码太多,文字太少,这里写个java学习路线总结
对于想要学习Java编程语言的人来说,制定学习路线是非常重要的。在这篇文章中,我将为您提供一个基础的Java学习路线,帮助您更快地掌握Java编程语言。
Java 基础
首先,您需要了解Java基础知识。这些知识包括Java语法、变量和数据类型、运算符、流程控制语句、数组、类和对象等。这个阶段最好通过阅读一些Java入门书籍或者在线教程来学习。我的建议是,如果您已经有编程经验,可以选择一些更深入的学习资源,例如《Java核心技术》或者《Thinking in Java》。
面向对象编程
Java 是一种面向对象的程序设计语言。因此,在学习Java时,必须熟悉面向对象编程思想。这个阶段,您应该学习对象、类、封装、继承、多态等面向对象编程的概念。我的建议是在学习Java的同时,也可以去学习其他语言的面向对象编程,如C++或Python等。
Java 集合框架
Java集合框架是Java中最重要的部分之一。它包括了Java中大部分用于数据存储和处理的类和接口。了解集合框架非常重要,因为它们是您在编写Java程序时必须使用的最常见工具之一。我的建议是学习ArrayList、LinkedList、HashMap、HashSet等基本的集合类。
Java 输入输出流
在Java编程中,输入输出流是必不可少的。Java提供了各种各样的类和接口来访问文件、网络和其他设备上的数据。这个阶段,您应该学习如何使用Java的输入输出流来读取和写入文件、网络连接和其他数据源。我的建议是学习Java.io包中的InputStream和OutputStream类。
Java 网络编程
Java 是一个广泛用于网络编程的语言。了解Java网络编程对于开发网络应用程序非常重要。这个阶段,您应该去了解Java网络编程所需要的Socket编程、TCP协议和UDP协议。我的建议是跟随一些使用Java进行网络编程的教程学习,例如《Java网络编程》或者《Head First Java》。
Java 多线程编程
Java 实现多线程编程非常容易,并且可以有效地提高程序的性能。了解多线程编程对于开发复杂的应用程序至关重要。这个阶段,您应该学习Java中的线程模型、线程安全、同步和锁等概念。我的建议是学习Java中的Thread类和Runnable接口。
Java 数据库编程
Java 与数据库的连接对于许多应用程序来说是至关重要的。Java提供了一个称为JDBC(Java Database Connectivity)的API,它允许您使用Java编写与各种关系型数据库进行交互的应用程序。这个阶段,您应该学习如何使用JDBC API来连接数据库、执行SQL语句和处理结果集。我的建议是学习Java中的JDBC技术。
Servlet 和 JSP
Servlet 和 JSP 是Java Web开发的基础。Servlet 允许在Web服务器上运行Java代码,而JSP 允许您在HTML文档中嵌入Java代码。这个阶段,您应该学习如何编写Servlet和JSP以及如何将它们部署到Web服务器上。我的建议是学习Java EE平台相关的知识,如Tomcat或者其他应用服务器。
SSM ,Springboot, Springcloud等框架
Spring 是一个非常流行的Java应用程序开发框架。它提供了大量的组件和工具,以帮助您更轻松地编写高质量的Java应用程序。Spring家族非常强大。
总结
以上就是基础的Java学习路线总结。学习Java需要长时间的投入和练习,但如果您按照上述路线进行学习,您将能够快速地掌握Java编程语言并开始开发自己的Java应用程序。记住,不要害怕犯错,不断尝试和实践,这是成为一名优秀Java程序员的关键。