APP后台 无密码登录 Security 认证流程思路

APP后台 无密码登录 Security 认证流程思路

后台使用spring security,但是app端显然不能使用像web端登录那样的处理方式,所以如何"骗过"spring security",下面介绍app接入短信登录与一键登录后的 security认证流程。

基本流程(伪代码展示) :

//短信登录
public Object SMSLogin(忽略信息参数){
			// 构建一个由账号密码组成的认证对象,在这个构造器内部会将对应的信息赋值给各自的本地变量,并且会调用父类AbstractAuthenticationToken构造器
			UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(账号(手机号),前端传的明文验证码));
			/** 
				调用authenticate方法时,这时开始认证上面构建的待认证对象,会调用到 loadUserByUsername(String username) 方法用来查询数据库是否存在等逻辑.
				需要重写此方法,先实现 UserDetailsService类.
			*/
            Authentication authenticate = authenticationManager.authenticate(usernamePasswordAuthenticationToken);
            //认证成功后取出认证后的用户信息.
            MyUserDetails myUserDetails = (MyUserDetails) authenticate.getPrincipal();
            //使用JWT生成token
            redis.set(存入用户的唯一过期标识之类的,用来进入系统时判断,此token是否过期),
            String token = "Bearer " + Jwts.builder()
            		// 主体标识信息
                    .setSubject(手机号)
                    //载荷
                    .addClaims(用户信息,权限等,用map装载)
                    // token失效时间
                    .setExpiration(new Date(currentTimeMillis + SecurityConstant.TOKEN_EXPIRE_TIME * 60 * 1000))
                    //签名(方式,盐)
                    .signWith(加密方式,)
                    //压缩方式,为啥压缩因为如果存放的东西很大的话,可以在网络传输期间减少它们的总大小
                    .compressWith(CompressionCodecs.GZIP).compact();
                    //得到token后就阔以做返回处理了
}

一键登录 无密码,无账号.
参数 token 由前端调用第三方接口得到后在调用后台登录接口,后台根据 token 调用第三方接口得到用户手机号。

//一键登录
public Object Login(String token){
	//第一步:调用第三方接口获取手机号等信息
	String phone = v1();
	//因为验证密码时是使用同一个 loadUserByUsername(String username)方法来判断是一键登录还是短信登录,所以为了区分,在这里做一个状态标识,
	// 插入状态标识(60秒自动失效,成功后手动清除)
    String oauthId //随机生成一个字符
    redis.set(前缀 + "手机号",oauthId,60);
    //以下代码与上个例子相同, 不同的是 构建认证对象时,密码传的是 oauthId,
    //注意: loadUserByUsername方法中,返回的 UserDetails 对象的密码必须是密文的,也就是说,赋值时得手动加密下,不然会匹配不上导致密码错误.
}

loadUserByUsername(String username) 方法

//根据用户名查询用户信息的方法
 public  UserDetails loadUserByUsername(String username){
 	1.先查库此账号是否存在,不存在则自动注册
 	2.存在则构建库里的信息,如果是验证码登录则将短信验证码加密返回,
 	3.Redis取出一键登录的标识如果存在则取出并将随机字符加密返回.
 }

Security 认证流程

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,我们可以使用各种库和框架来实现基于用户密码方式的后台登录网站。下面是一个简单的示例,使用Flask框架和SQLite数据库来实现: 首先,我们需要安装Flask和SQLite: ```python pip install flask pip install flask_sqlalchemy ``` 然后,我们创建一个Flask应用,并设置数据库连接: ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' db = SQLAlchemy(app) ``` 接下来,我们创建一个User模型类,用于表示用户信息: ```python class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) password = db.Column(db.String(120), nullable=False) def __init__(self, username, password): self.username = username self.password = password ``` 然后,我们创建一个用于处理登录请求的路由: ```python @app.route('/login', methods=['POST']) def login(): username = request.form['username'] password = request.form['password'] user = User.query.filter_by(username=username).first() if user is None or not user.password == password: return '登录失败' return '登录成功' ``` 最后,我们运行应用程序: ```python if __name__ == '__main__': db.create_all() app.run() ``` 以上示例中,我们定义了一个User类用于表示用户信息,包括用户名和密码。在登录路由中,我们使用`request.form`来获取POST请求中的用户名和密码,然后从数据库中查询对应的用户信息,比较密码是否正确,如果验证通过则返回"登录成功",否则返回"登录失败"。 这是一个简单的示例,实际应用中可能需要考虑更多的安全性和验证机制,例如密码哈希存储、登录状态维持等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值