springboot简单实现单点登录的示例代码

Spring Boot是一个非常流行的Java Web框架,它提供了很多便捷的功能和工具,可以帮助我们快速构建Web应用程序。其中,单点登录(Single Sign-On,简称SSO)是一个非常重要的功能,可以让用户在多个应用程序之间无需重复登录。以下是Spring Boot简单实现单点登录的示例代码的完整攻略:

  1. 使用Spring Security实现单点登录

Spring Security是Spring Boot中的一个重要组件,它提供了很多安全功能和工具,可以帮助我们实现单点登录。以下是一个示例:

  • 创建一个Spring Boot项目,并添加Spring Security依赖。
  • 创建一个名为SecurityConfig的配置类,并使用@EnableWebSecurity注解来启用Web安全功能。我们使用HttpSecurity对象来配置安全规则,并使用formLogin()方法来启用表单登录功能。
  • 创建一个名为UserController的控制器类,并使用@PreAuthorize注解来限制访问控制器的权限。我们使用@PreAuthorize注解来指定只有具有ROLE_USER角色的用户才能访问控制器。
  • 在application.properties文件中配置Spring Security的用户名和密码。

以下是示例代码:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/user/**").hasRole("USER")
                .anyRequest().authenticated()
                .and()
                .formLogin();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user").password("{noop}password").roles("USER");
    }
}

@RestController
public class UserController {
    @GetMapping("/user")
    @PreAuthorize("hasRole('USER')")
    public String getUser() {
        return "Hello, user!";
    }
}

在上面的示例中,我们使用Spring Security来实现单点登录功能。我们创建了一个名为SecurityConfig的配置类,并使用@EnableWebSecurity注解来启用Web安全功能。我们使用HttpSecurity对象来配置安全规则,并使用formLogin()方法来启用表单登录功能。我们创建了一个名为UserController的控制器类,并使用@PreAuthorize注解来限制访问控制器的权限。我们在application.properties文件中配置了Spring Security的用户名和密码。

  1. 使用JWT实现单点登录

JWT(JSON Web Token)是一种轻量级的身份验证和授权机制,可以帮助我们实现单点登录。以下是一个示例:

  • 创建一个Spring Boot项目,并添加Spring Security和JWT依赖。
  • 创建一个名为JwtTokenUtil的工具类,用于生成和验证JWT令牌。
  • 创建一个名为JwtUserDetailsService的用户服务类,用于从数据库中获取用户信息。
  • 创建一个名为JwtAuthenticationEntryPoint的认证入口类,用于处理认证异常。
  • 创建一个名为JwtAuthenticationTokenFilter的认证过滤器类,用于验证JWT令牌。
  • 创建一个名为JwtAuthorizationTokenFilter的授权过滤器类,用于授权用户访问资源。
  • 创建一个名为UserController的控制器类,并使用@PreAuthorize注解来限制访问控制器的权限。

以下是示例代码:

@Component
public class JwtTokenUtil {
    private static final String SECRET = "mySecret";
    private static final long EXPIRATION_TIME = 864_000_000; // 10 days

    public String generateToken(UserDetails userDetails) {
        Map<String, Object> claims = new HashMap<>();
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(userDetails.getUsername())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .signWith(SignatureAlgorithm.HS512, SECRET)
                .compact();
    }

    public String getUsernameFromToken(String token) {
        return Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody().getSubject();
    }

    public boolean validateToken(String token, UserDetails userDetails) {
        String username = getUsernameFromToken(token);
        return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
    }

    private boolean isTokenExpired(String token) {
        Date expiration = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody().getExpiration();
        return expiration.before(new Date());
    }
}

@Service
public class JwtUserDetailsService implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found with username: " + username);
        }
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),
                new ArrayList<>());
    }
}

@Component
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response,
                         AuthenticationException authException) throws IOException {
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
    }
}

public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
    @Autowired
    private JwtUserDetailsService userDetailsService;

    @Autowired
    private JwtTokenUtil jwtTokenUtil;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        final String requestTokenHeader = request.getHeader("Authorization");

        String username = null;
        String jwtToken = null;

        if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) {
            jwtToken = requestTokenHeader.substring(7);
            try {
                username = jwtTokenUtil.getUsernameFromToken(jwtToken);
            } catch (IllegalArgumentException e) {
                logger.error("Unable to get JWT Token");
            } catch (ExpiredJwtException e) {
                logger.error("JWT Token has expired");
            }
        } else {
            logger.warn("JWT Token does not begin with Bearer String");
        }

        if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
            UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);

            if (jwtTokenUtil.validateToken(jwtToken, userDetails)) {
                UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
                        userDetails, null, userDetails.getAuthorities());
                usernamePasswordAuthenticationToken
                        .setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
            }
        }
        chain.doFilter(request, response);
    }
}

public class JwtAuthorizationTokenFilter extends OncePerRequestFilter {
    @Autowired
    private JwtUserDetailsService userDetailsService;

    @Autowired
    private JwtTokenUtil jwtTokenUtil;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        final String requestTokenHeader = request.getHeader("Authorization");

        String username = null;
        String jwtToken = null;

        if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) {
            jwtToken = requestTokenHeader.substring(7);
            try {
                username = jwtTokenUtil.getUsernameFromToken(jwtToken);
            } catch (IllegalArgumentException e) {
                logger.error("Unable to get JWT Token");
            } catch (ExpiredJwtException e) {
                logger.error("JWT Token has expired");
            }
        } else {
            logger.warn("JWT Token does not begin with Bearer String");
        }

        if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
            UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);

            if (jwtTokenUtil.validateToken(jwtToken, userDetails)) {
                UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
                        userDetails, null, userDetails.getAuthorities());
                usernamePasswordAuthenticationToken
                        .setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
            }
        }
        chain.doFilter(request, response);
    }
}

@RestController
public class UserController {
    @GetMapping("/user")
    @PreAuthorize("hasRole('USER')")
    public String getUser() {
        return "Hello, user!";
    }
}

在上面的示例中,我们使用JWT来实现单点登录功能。我们创建了一个名为JwtTokenUtil的工具类,用于生成和验证JWT令牌。我们创建了一个名为JwtUserDetailsService的用户服务类,用于从数据库中获取用户信息。我们创建了一个名为JwtAuthenticationEntryPoint的认证入口类,用于处理认证异常。我们创建了一个名为JwtAuthenticationTokenFilter的认证过滤器类,用于验证JWT令牌。我们创建了一个名为JwtAuthorizationTokenFilter的授权过滤器类,用于授权用户访问资源。我们创建了一个名为UserController的控制器类,并使用@PreAuthorize注解来限制访问控制器的权限。

以上是Spring Boot简单实现单点登录的示例代码的完整攻略,其中包括使用Spring Security实现单点登录和使用JWT实现单点登录的示例。根据应用程序的需求和开发人员的经验,可以选择最适合的方法来实现单点登录功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot简单实现单点登录的示例代码 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 使用spring boot 整合kafka,延迟启动消费者

    下面是使用Spring Boot整合Kafka,延迟启动消费者的详细攻略,由以下步骤组成: 添加Kafka依赖 在Spring Boot项目中,需要在pom.xml文件中添加Kafka的依赖,可以通过以下方式添加: <dependency> <groupId>org.springframework.kafka</groupId&…

    Java 2023年5月20日
    00
  • Java(springboot) 读取txt文本内容代码实例

    下面是关于”Java(springboot) 读取txt文本内容代码实例”的完整攻略: 1. 准备工作 在开始实际操作之前,请确保你已经按照以下步骤准备就绪: 已安装好springboot 已经找到要读取的txt文件,并将其放置于项目的资源文件夹中 2. 代码实现 2.1. 读取文件内容到String import org.springframework.c…

    Java 2023年5月19日
    00
  • 详细解读Hibernate的缓存机制

    详细解读Hibernate的缓存机制 Hibernate作为一个优秀的对象关系映射工具,其具有强大的缓存机制,对于提高系统性能有很大的作用。但是,如果我们不了解它的缓存机制以及所带来的优缺点,可能会导致系统性能下降,因此对于Hibernate的缓存机制需要进行详细的解读。 1. Hibernate的缓存机制 Hibernate的缓存机制可以分为三层,分别是一…

    Java 2023年5月19日
    00
  • Java动态代理的作用是什么?

    Java动态代理是一种在运行时期动态生成代理类的机制,通过代理类来调用目标对象的方法。在Java语言中,动态代理主要运用在AOP(面向切面编程)和RPC(远程过程调用)等场景中。其主要作用是在不修改目标对象的基础上,为目标对象添加额外的操作,称为“代理”。 使用动态代理的步骤如下: 创建一个InvocationHandler对象,并实现一个invoke方法,…

    Java 2023年5月10日
    00
  • SpringBoot Service和Dao的编写详解

    针对 “SpringBoot Service 和 Dao 的编写详解” ,下面是完整的攻略: 1. 什么是 SpringBoot Service 和 Dao 在开发 Web 应用程序时,我们通常会遵循 MVC 的设计模式。其中 Service 和 Dao 层属于模型层的一部分,分别负责业务处理和数据访问。 SpringBoot Service 层主要负责业务…

    Java 2023年5月15日
    00
  • JSP的response对象的实例详解

    JSP的response对象的实例详解 在JSP中,response对象代表服务器向客户端发送响应。它是JSP内置对象之一,可以用来设置HTTP响应的相关信息,如响应头、响应状态码、输出内容等。在本篇攻略中,我们将详细讲解如何使用response对象,包括以下内容: 设置响应头 设置响应状态码 输出HTML内容 文件下载 设置响应头 使用response对象…

    Java 2023年6月15日
    00
  • SpringSecurity实现访问控制url匹配

    Spring Security是Spring框架的一个安全框架,在Java web应用程序中提供了一种灵活的安全性控制机制,可以控制到每个请求的细节。其中包括请求验证、授权、验证管理等。在开发web应用程序时,实现访问控制url匹配是一个非常重要的特性,本文将介绍如何使用Spring Security实现访问控制url匹配。 步骤一:添加Spring Sec…

    Java 2023年5月20日
    00
  • 用定制标签库和配置文件实现对JSP页面元素的访问控制

    实现对JSP页面元素的访问控制,可以通过定义自定义标签来实现。通过在JSP页面引入自定义标签库,并根据标签的属性值控制对应元素的显示与隐藏,从而实现访问控制的目的。 以下是实现步骤: 在项目中创建自定义标签库文件(例如custom.tld),定义自定义标签及其属性。例如: <taglib xmlns="http://java.sun.com/…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部