【Java】Springboot+Shiro简单粗暴的单点登录SSO

博主分享了一次实现单点登录(SSO)的经历,反对盲目复制粘贴复杂的代码实现。他提出通过简单的账号密码验证方式,结合Shiro框架,实现了单点登录功能。核心思路是前端传递账号,后台查询数据库获取密码,然后使用UsernamePasswordToken进行登录操作。博客强调了有时候问题的本质并不复杂,关键在于如何提炼和简化解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这两天有个自开发系统要做单点登录。
本来想简单的一搞,结果网上一搜,全都是一堆Override…你抄我我抄他的程序员乱象什么时候是个头啊!
我就想几行代码一把梭,不想浪费太多时间。
一开始,我想的是使用官方的做法去做,毕竟更规范一些。然后就开始找各种资料,看官方文档等等。但是看了半圈下来,一天快过去了,除了更熟悉shiro之外,没什么头绪。
后来我转念一想,不就是认证嘛,你不就要个账号和密码嘛。账号肯定是前端传过来的嘛,大不了做个加密字符串,我到后台来再密钥解密一把。至于密码,直接用解密出来的账号去数据库查密码,如果密码是加密存储的,解密一把,或者把前台传过来的密码加密一把。
这样,账号密码都有了,传给 UsernamePasswordToken 就ok啦!
最终,单点代码如下:

@RequestMapping("/sso")
    public String SSOLogin(String username,Model model,HttpSession session) {
        System.out.println(username);
        User usertmp = userService.queryUserByUserName(username);
        if(usertmp == null){
            model.addAttribute("msg","用户不存在");
            return "login";
        }
        /*
        * 重点不就是这句么,找到他的password,你要password,我给你就好了啊~
        */
        String password = usertmp.getPassword();

        Subject subject = SecurityUtils.getSubject();
        // 2 封装用户数据
        UsernamePasswordToken token = new UsernamePasswordToken();
        token.setUsername(username);
        token.setPassword(password.toCharArray());
        // 3 执行登陆
        try{
            subject.login(token);
            // 获取user
            User user = (User) subject.getPrincipal();
            session.setAttribute("user",user);
            model.addAttribute("msg","登陆成功");
            return "redirect:/index";
        }catch (UnknownAccountException ex){
            model.addAttribute("msg","用户不存在");
            return "login";
        }catch (IncorrectCredentialsException incorrectCredentialsException) {
            model.addAttribute("msg","密码不正确");
            return "login";
        }
    }

有时候啊,不要把问题想得太复杂。
当然这不是最终的代码,毕竟很少有人把密码明文存储并且…我会给一个标志位来标识自己的程序单点登录~类似于密钥吧!
对了,密钥不念mi yao ,念 mi yue.
不信可以自己查。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值