后端登录安全的一种思路

这篇具有很好参考价值的文章主要介绍了后端登录安全的一种思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

PS:作者是小白能接触到的就只会这样写。勿喷。 前提

思路: 结合io流将登录token存储到配置文件中,不将token存储到浏览器端,从而避免盗取。

下面jwt的学习可以参考下这个:

JWT --- 入门学习_本郡主是喵的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-633684.html

JWT工具类

@Component
public class JWTtUtils {

    public static final String USER_NAME = "username";
    public static final String PASS_WORD = "password";
    public static final String CREATE_TIME = "createTime";
    public static final String SIGN_KEY = "QHX2004"; // 解析key
    /**
     * 用用户名和密码生成JWT
     *
     * @param username
     * @param password
     * @return
     */

    public String generatorJWTFromUserNameAndPassword(String username,String password){
        HashMap<String, Object> hashMap = new HashMap<>(); // 生成map
        hashMap.put(USER_NAME,username);
        hashMap.put(PASS_WORD,password);
        hashMap.put(CREATE_TIME,new Date());
        return  generatorJWTFromUserNameAndPassword(hashMap);
    }

    /**
     * 生成jwt过期时间,1个月
     *
     * @param
     * @return
     */
    private Date generatorExpirationDate() {
        return new Date(System.currentTimeMillis() + (1000L * 60 * 60 *24 *30));
    }

    /**
     * 用用户名和密码生成jwt
     *
     * @param paramMap
     * @return
     */
    private String generatorJWTFromUserNameAndPassword(HashMap<String, Object> paramMap) {
        JwtBuilder jwtBuilder = Jwts.builder()
                .setClaims(paramMap)
                .setExpiration(generatorExpirationDate()) // 设置过期时间
                .signWith(SignatureAlgorithm.HS512,SIGN_KEY);
        return jwtBuilder.compact(); // 拿到token
    }



    /**
     * 解析token拿到Claims
     *
     *
     * @param token
     * @return
     */
     private Claims getClaimsFromToken(String token){
        Claims claims = Jwts.parser()
                .setSigningKey(SIGN_KEY)
                .parseClaimsJws(token)
                .getBody();

        return claims;
    }

    /**
     * 校验token是否过期
     *
     * @param token
     * @return
     */
  // 过期返回true
    public boolean checkTokenIsOverdue(String token){
        Claims claims = getClaimsFromToken(token);
        Date date =  claims.getExpiration();
        return date.getTime() < new Date().getTime();
    }


    /**
     * 刷新token:重新生成一个token
     *
     * @param
     * @return
     */

    public String flushToken(String token){
        Claims claims = getClaimsFromToken(token);
        String username = (String) claims.get(USER_NAME);
        String password = (String)claims.get(PASS_WORD);
        return generatorJWTFromUserNameAndPassword(username,password);
    }

}

IO工具类

public class IOUtils {


    public static final String FILE_NAME = "conf.properties";

    /**
     *   配置文件读取
     * @param key
     * @return  value
     */

    public static String getPropertiesKey(String key)  {
      return  getKey(key);
    }

    /**
     * 配置文件读取
     *
     * @param  key
     * @return
     */
    private static String getKey(String key) {
        Properties properties = new Properties();
        File file = new File(FILE_NAME);
        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file);
            properties.load(inputStream); // 其实已经将配置文件拿到手了
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(inputStream != null){  // 还是这样关比较好,万一报错就tm关不了
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return  properties.getProperty(key);
    }

    /**
     * 配置文件设置
     *
     * @param key
     * @param value
     * @return
     */
    public static boolean setPropertiesKey(String key,String value) {
        // 判断key是否有重复
        String key1 = getKey(key);
        if(key1 == null){
            return setKey(key,value); // 把核心业务逻辑抽出来
        }
        return false;
    }

    /**
     *  配置文件设置
     *
     * @param key
     * @param value
     * @return boolean
     */
    private static boolean setKey(String key, String value) {
        Properties properties = new Properties();
        File file = new File(FILE_NAME); // 其实有其他配置可以同意下yaml文件里面配置,然后这里面读取,好统一调配。
        FileWriter fileWriter = null;
        try {
            fileWriter = new FileWriter(file,true);
            properties.setProperty(key, value); // 存进map里面
            properties.store(fileWriter,""); // 将map对应的键值对写进输出流。
        } catch (IOException e) {
            // 卧槽我加入设置key,value失败,肯定调到这个逻辑
            return false;
        } finally {
            if (fileWriter != null) {  // 还是这样关比较好,万一报错就tm关不了
                try {
                    fileWriter.flush();
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return true;
    }

}

测试文件

@SpringBootTest
class IoDemoApplicationTests {

    @Test
    void contextLoads() {
        // 用户第一登录 ----,我们这里浏览器端不存token,只存用户名,更安全。
        String username = "qhx2005";
        String password = "123456";
        // 生成jwt
        JWTtUtils jwTtUtils = new JWTtUtils();
        String token = jwTtUtils.generatorJWTFromUserNameAndPassword(username, password);
        // 将jwt存进配置文件
        boolean success = IOUtils.setPropertiesKey(username, token);
        System.out.println("存进配置文件成功状态:"+success);
        assert success;


        // 用户登录后访问其他页面。检验token过期,拿出配置文件是否存在----
        // 获取token
        String token1 = IOUtils.getPropertiesKey(username);
        System.out.println(token1);
        // 检验token是否过期
        boolean overdue = jwTtUtils.checkTokenIsOverdue(token);
        // 本来这里如果token过期,我们响应一个状态码,让前端axios过滤器捕获到,删除本地username,重定向到登录页。
        System.out.println("已经过期:"+overdue);

    }

}

到了这里,关于后端登录安全的一种思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【工作小札】利用动态数据源实现Sass的一种思路(内含完整代码示例)

    ✨这里是第七人格的博客✨小七,欢迎您的到来~✨ 🍅系列专栏:【工作小札】🍅 ✈️本篇内容: 利用动态数据源实现Sass化✈️ 🍱本篇收录完整代码地址:https://gitee.com/diqirenge/sheep-web-demo/tree/master/sheep-web-demo-dynamicDataSource🍱 针对Sass多租户,业内有许多解决方案。一般来说

    2023年04月20日
    浏览(46)
  • Windows11设置微软账户登录,无法登录进不了桌面的一种解决方法

            今天将windows11的本地账户切换成微软账户后,开机需要重新登录微软账户才能进入桌面,但是一直转圈无法登录,无法进入桌面。微软社区发现有同样问题,但是没有解决方法。         一般微软账户无法登录需要进行如下修改,断开该网络再重新连接使设置

    2024年02月05日
    浏览(270)
  • frida注入进程报错Failed to spawn: unable to find application with identifier的一种解决思路

    之前写过一篇文章【转载】绕过ssl pining使用burp抓包微信小程序_HRay\\\'s blog-CSDN博客 今天在测试一款app的时候使用frida-ps -U查看进程结果如下 乐学小鹅为我们要注入的进程,但是注入进程时使用命令 frida -U -f 乐学小鹅 -l D:ADBfridascript.js --no-paus 爆出错误Failed to spawn: unable to fin

    2024年02月11日
    浏览(65)
  • 关于小程序微信登录后端设计的一点分享

    我们知道微信小程序对于微信登录的设计其实是给到了一个微信login的功能接口,其中响应成功会返回一个临时凭证码(时间大概是5分钟)code,这个临时的凭证码是从https://api.weixin.qq.com/sns/jscode2session获取openId的必带参数。下图示微信登录过程的时序图:  这里我们只介绍到

    2024年02月10日
    浏览(32)
  • 安全审计——等级保护日志审计要求的一种解决方案

        在网络安全等级保护中,对日志有着一系列的要求,通常以部署日志审计系统来满足等保的要求,此处我们选择syslog来实现日志的集中收集,统一管理。     在这里我们主要目标是满足安全区域边界、安全管理中心里的下面两条的要求。其中安全管理中心的日志

    2024年02月16日
    浏览(49)
  • Windows11/10 使用RDP远程桌面时提示 您的凭据不工作/登录没有成功可能的一种原因

    微软官方的关于有关远程桌面客户端的常见问题 Windows新装系统时就已经设置了Windows Hello,而登录系统时一直使用Windows Hello, 未使用过密码 进行登录 能确定登录所用用户名和密码正确 新建的本地账户可以正常使用RDP进行远程登录 我在使用RDP登录时虽然输入了正确的账号和密

    2024年02月06日
    浏览(85)
  • Java 客户端调用 WebService 接口的一种方式

      通过SoapUI创建一个SOAP Project;   项目名称自定义,WSDL地址维护WebService接口地址。点击OK即可   项目创建完成后,展开WebService项,可以看到具体的接口,打开接口下的Request,右侧面板Form标签下可以清晰的看到请求入参,点击Submit请求按钮可以看到Overview标签下的响应结

    2024年01月18日
    浏览(42)
  • 一种 IT 和 OT 安全融合的思路

    摘 要 数字化、网络化、智能化加速发展,使得信息技术(Information Technology,IT)与操作技术(Operation Technology,OT)融合成为工业数字化转型和制造业高质量发展的关键。与此同时,网络风险也不断向工业领域渗透蔓延。从多个维度分析当前 IT 和 OT 融合的现状,科学论证其

    2024年02月04日
    浏览(36)
  • 【Java】后端开发语言Java和C#,两者对比注解和属性的区别以及作用

    欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平有限

    2024年01月16日
    浏览(48)
  • 大型医院云HIS系统:采用前后端分离架构,前端由Angular语言、JavaScript开发;后端使用Java语言开发 融合B/S版电子病历系统

    一套医院云his系统源码 采用前后端分离架构,前端由Angular语言、JavaScript开发;后端使用Java语言开发。融合B/S版电子病历系统,支持电子病历四级,HIS与电子病历系统均拥有自主知识产权。 文末卡片获取联系! 基于云计算技术的B/S架构的医院管理系统(简称云HIS),采用前后

    2024年02月03日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包