springboot 单点登录(详细代码)

单点登录,就是在一个系统登录后,在它的关联系统也不用重新登录了。实现单点登录,主要就是利用同域名传递 cookie 中的登录用户信息。
摘要由CSDN通过智能技术生成

单点登录,就是在一个系统登录后,在它的关联系统也不用重新登录了。例如:你成功登录了淘宝,那么在天猫也就成功登录了;同理,退出也是一样的。在天猫退出账号,在淘宝的账号也就退出了。(咳咳,同一浏览器内)

实现单点登录,主要就是利用同域名传递 cookie 中的登录用户信息。以下是一种实现方式,仅供参考!

准备工作

1)
系统:win10
IDE:sts4
springboot2.2.4.RELEASE、 jdk8、 maven3.3.9

在本例中,创建了4个 springboot 项目,一个专用来处理登录(login.sso.com),其他都是关联系统,把 sys1.sso.com 当做是主系统。

如果用户首先在 sys1 系统的首页浏览,此时点击登录,则跳转到登录系统处理登录逻辑。登录成功后,会跳转到 sys1 系统的首页,并且是已登录状态。
同理用户在 sys2 系统的首页浏览,此时点击登录,则跳转到登录系统处理登录逻辑。登录成功后,会跳转到 sys2 系统的首页,并且是已登录状态。
那如果一开始就是没有在其他系统浏览,而是直接到登录系统进行登录呢。那这种情况登录成功后,本例会跳转到 sys1 的首页,即设定 sys1 为主系统的意思

2)域名映射
修改 hosts 文件,路径:C:\Windows\System32\drivers\etc
在这里插入图片描述

登录系统

登录系统只有一个登录界面和处理登录信息的逻辑
1)pom 依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

没有使用数据库,用户信息是写死的,所以只需要这两个依赖就够了。

2)登录界面 login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>sso-login</title>
</head>
<body>
	<h3>这里是登录页面</h3>
	<p style="color:red;" th:text="${session.msg}"></p>
	<form action="/login" method="post">
		用户名:<input type="text" name="uname"/><br/>
		密码:<input type="password" name="upwd"/><br/>
		<button 
  • 5
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
抱歉,我是一个AI语言模型,无法提供您所需的完整代码。不过,我可以为您提供一些Spring Boot和Shiro单点登录的基本实现步骤。 1. 配置Shiro的Realm,用于认证和授权用户信息。 2. 配置Shiro的Filter,用于拦截用户请求,判断用户是否已经登录。 3. 实现单点登录的逻辑,包括用户登录和退出登录的处理。 4. 在其他应用中配置Shiro,使其也能够使用单点登录。 以下是一个简单的示例代码,仅供参考: 1. 配置Shiro的Realm ```java public class MyRealm extends AuthorizingRealm { @Autowired private UserService userService; // 认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String username = (String) token.getPrincipal(); User user = userService.findByUsername(username); if (user == null) { throw new UnknownAccountException(); } return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName()); } // 授权 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String) principals.getPrimaryPrincipal(); User user = userService.findByUsername(username); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); authorizationInfo.addRole(user.getRole()); authorizationInfo.addStringPermission(user.getPermission()); return authorizationInfo; } } ``` 2. 配置Shiro的Filter ```java public class MyFilter extends AccessControlFilter { @Autowired private SessionManager sessionManager; // 拦截请求 @Override protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; String sessionId = req.getRequestedSessionId(); if (sessionId != null && sessionManager.getSession(sessionId) != null) { return true; } resp.sendRedirect("/login"); // 未登录,跳转到登录页 return false; } // 处理未登录的情况 @Override protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { return false; } } ``` 3. 实现单点登录的逻辑 ```java public class LoginController { @Autowired private UserService userService; @Autowired private SessionManager sessionManager; // 登录 @RequestMapping("/login") public String login(String username, String password, HttpSession session) { User user = userService.findByUsername(username); if (user != null && user.getPassword().equals(password)) { String sessionId = sessionManager.createSession(user); session.setAttribute("sessionId", sessionId); return "redirect:/index"; } return "login"; } // 退出登录 @RequestMapping("/logout") public String logout(HttpSession session) { String sessionId = (String) session.getAttribute("sessionId"); sessionManager.removeSession(sessionId); session.invalidate(); return "redirect:/login"; } } ``` 4. 在其他应用中配置Shiro 在其他应用中,需要配置Shiro使用单点登录,以便于共享用户信息。具体实现方式可以参考Shiro的官方文档。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值