单点登录实现思路
设计目的:
- 防止用户重复提交
- 防止用户窃取cookie之后冒用登录信息
实现思路:
动态获取用户登陆地址IP信息.
当用户登陆操作时,将username当做key,利用hash技术保存到redis中
username:{IP:用户IP地址,JL_USERJSON:‘json数据’,JL_TICKET:“TICKET”}
设计目的,将用户的完整记录保存到redis中.
用户登陆操作:
- 当用户登陆时,输入用户名和密码,获取用户的全部信息保存到redis中
- 登陆成功之后将用户名 TICKET和username信息写入cookie中
动态获取用户信息:
通过JS校验用户判断用户是否已经登陆
如果用户登陆过,则cookie中一定有ticket信息和usrename信息.发起jsonp请求,请求后台服务器数
据
- 后台动态获取数据.ticket和username数据.
- 根据username获取用户的hash数据. 首先对比IP地址.如果IP地址与redis中保存的IP不
一致,则表示恶意登录.不予展现- 对比ticket信息与redis中的ticket信息对比.是否正确.
- 如果通过ticket获取的数据不为null则表示用户登陆正确.予以正确返回.
一、精灵单点登录系统
1.1 精灵登录注册页面跳转
- 登录url地址
http://www.jt.com/user/login.html
- 注册url地址
http://www.jt.com/user/register.html
在jl-web的控制层添加
UserController
实现登录注册的通用页面跳转
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/{moduleName}")
public String moduleName(@PathVariable String moduleName) {
return moduleName;
}
}
1.2 单点登录项目搭建
- new -> Moudule> maven 创建子项目jl-sso
- 继承、添加
jl-common
工具类依赖和跳过测试类打包的插件- 将
jl-manage
的resources
复制到jl-sso
- 修改配置文件
application.yml
设置端口为8093 ,引入druid数据源和mybatis-plush配置- 将
ItemMapper.xml
改成UserMapper.xml
properties
目录里只留下redis的配置- 创建
SpringBootRun
启动类 ,加上@MapperScan("com.jl.mapper")
注解
1.2.1 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>jl</artifactId>
<groupId>com.jl</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jl-sso</artifactId>
<dependencies>
<dependency>
<groupId>com.jl</groupId>
<artifactId>jl-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--跳过测试类打包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.2.2 application.yml
server:
port: 8093
servlet:
context-path: /
spring:
datasource:
#引入druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jldb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
mvc:
view:
prefix: /WEB-INF/views/
suffix: .jsp
#mybatis-plush配置
mybatis-plus:
type-aliases-package: com.jl.pojo
mapper-locations: classpath:/mybatis/mappers/*.xml
configuration:
map-underscore-to-camel-case: true
logging:
level:
com.jl.mapper: debug
1.2.3 UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jl.mapper.UserMapper">
<!--留着以后用 -->
</mapper>
1.2.4 SpringBootRun
package com.jl;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.jl.mapper") //导入mapper接口文件
public class SpringBootRun {
public static void main(String[] args) {
SpringApplication.run(SpringBootRun.class);
}
}
1.2.5 项目结构
1.3 编辑POJO user
@TableName("tb_user")
@Data
@Accessors(chain = true)
public class User extends BasePojo{
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String password;
private String phone;
private String email;
}
1.4 配置nginx服务
修改hosts :
127.0.0.1 sso.jl.com
#配置sso服务器 hosts
server {
listen 80;
server_name sso.jl.com;
location / {
proxy_pass http://localhost:8093;
}
}
二、实现用户信息校验
2.1 业务接口文档
请求方法 | GET |
---|---|
URL | http://sso.jl.com/user/check/{param}/{type} |
参数 | 格式如:chenchen/1 其中chenchen是校验的数据 Type为类型,可选参数1 username、2 phone、3 email |
示例 | http://sso.jl.com/user/check/chenchen/1 |
返回值 | { status: 200 //200 成功,201 没有查到 msg: “OK” //返回信息消息 data: false //返回数据true用户已存在,false用户不存在,可以 } |
2.2 编辑jl-sso的 UserController
利用JSONP实现用户信息校验
package com.jl.controller;
import com.fasterxml.jackson.databind.util.JSONPObject;
import com.jl.service.UserService;
import com.jl.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/check/{param}/{type}")
public JSONPObject checkUser(@PathVariable String param, @PathVariable Integer type, String callback) {
//校验用户信息
boolean result = userService.checkUser(param, type);
SysResult sysResult = SysResult.success(result);
return new JSONPObject(callback, sysResult);
}
}
2.3 编辑jl-sso的UserServiceImpl
UserService
接口中添加checkUser
方法
package com.jl.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jl