登录失败未授予用户在此计算机上的请求登录_SSO单点登录系统的实战运用

通用介绍


单点登录系统,简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。任何SSO框架都需要创建统一的认证中心!

解决问题


当我们有多个系统时,每个系统都需要做登录操作的时候,会遇到非常繁琐的问题(频繁的登录),当调用其他服务时也会出现访问不到,授权的问题,那么怎么解决此问题呢?我们就用到了SSO框架。

框架介绍


我们使用MaJiaSSO框架来解决单点登录问题。此框架使用非常简单,五分钟集成框架,使用JWT作为Token,不依赖任何存储,用户可以携带自定义信息,可以自定义Token加密盐。我们只需要创建一个统一的认证服务,此服务我们用来验证用户登录,并且验证获取Token。访问其他服务时,只需要带上Token就可以进行访问。我们可以使用@NoToken注解来控制放开那些不需要注解的请求映射。

对比优点

  1. 不依赖任何存储(大部分SSO依赖缓存/Redis/Mysql等存储)
  2. 即插即用,五分钟集成
  3. Token基于JWT,用户可以自己携带信息
  4. 用户自定义加密盐,安全便捷
  5. 基于注解控制请求,简单方便
  6. 基于拦截器,可以动态控制拦截请求(推荐拦截所有/**,使用@NoToken控制)
  7. 认证服务器重启无影响,无缓存

使用SSO框架

建立统一认证中心
pom引入

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.10.RELEASE</version>
		<relativePath />
	</parent>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- sso core -->
		<dependency>
			<groupId>com.majiaxueyuan</groupId>
			<artifactId>sso-core</artifactId>
			<version>1.2.2</version>
		</dependency>
	</dependencies>


登录请求Controller
在这里,为了方便就不编写Sql服务,假如用户名和密码分别为admin/123456时表示认证通过。
认证通过时,调用方法loginSuccess,传入参数(唯一ID,用户名,其他信息,自定义加密盐),判断返回状态码是不是200,如果是,直接获取data就是TOKEN值。

@RestController
public class LoginController {
	@RequestMapping("/login")
	public String login(String username, String password) {
		if (username.equals("admin") && password.equals("123456")) {
			// 表示登录成功
			JSONObject json = new JSONObject();
			json.put("username", username);
			json.put("role", new ArrayList<String>(Arrays.asList("admin", "normal")));
			Result loginSuccess = TokenLoginHelper.loginSuccess(1L, username, json.toJSONString(), "token-salt");
			if (loginSuccess.getCode().equals(200)) {
				String token = loginSuccess.getData().toString();
				System.out.println(token);
				return "token:" + token;
			}
			return "登录失败";
		}
		return "failed";
	}
}

6e7fad6e6aedebe8471897eede495414.png


到这里认证服务就集成完毕了

普通服务集成MaJiaSSO


对于普通服务而言,一个服务也是这样集成,两个服务也是这样集成…100个服务也是这样集成。
注意事项:在集成时,我们需要注意设置加密盐要和授权中心一致(必须一致,一把锁必须对应它的钥匙才能打开锁)

集成步骤:

  1. 创建正常的SpringBoot服务
  2. 引用Jar包
  3. 添加拦截器
  4. 放开不需要认证的请求
  5. 集成就完毕了!!!

pom.xml

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.10.RELEASE</version>
		<relativePath />
	</parent>


	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>com.majiaxueyuan</groupId>
			<artifactId>sso-core</artifactId>
			<version>1.2.2</version>
		</dependency>
	</dependencies>

添加MaJiaSSO拦截器,并设置加密盐

@Configuration
public class MaJiaSsoConfig extends WebMvcConfigurerAdapter {
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(ssoIntercepter()).addPathPatterns("/**");
	}

	@Bean
	public MaJiaSSOIntercepter ssoIntercepter() {
		return new MaJiaSSOIntercepter().setTokenSalt("token-salt");
	}
}

放开某些请求,并且获取我们保存在Token中的信息

/hello请求是需要我们携带Token进行访问的,而/hi请求则利用注解放开了验证,代码如下

@RestController
public class ClientController {

	@RequestMapping("/hello")
	public String hello(HttpServletRequest req) {
		SSOUser user = (SSOUser) req.getAttribute("ssoUser");
		System.out.println(user.toString());
		return "hello";
	}

	@RequestMapping("/hi")
	@NoToken(notNeedToken = true)
	public String wei() {
		return "hi,no token!";
	}
}

访问图(不需要Token,被NoToken注解)

670fd7314dcbcbb25345ad2e89c9faab.png

需要Token未携带时访问(返回Code401),当Token不合法,会提示非法请求

78b6928d79e037bf1d532d095510452f.png

正常携带Token时访问,并且控制台会打印出我们携带的所有信息

e564bb9cf7c5552605ad441c24c8d390.png


控制台打印携带的信息

4541b2b2b12d893c63757322d62cd35c.png


当携带错误的Token进行访问时,我们可以理解为有人恶意的攻击我们的系统,给出提示

0518c2df47e5d465f8c466dbd2048ca7.png


到这里我们集成MaJiaSSO就成功了,可以添加很多服务,为每个服务添加上拦截器就OK!SSO就是这么简单。
点击查看更多内容

作者:LLL丶衣羊

链接:https://www.imooc.com/article/288908

来源:慕课网

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值