最简单的Shiro免密登陆(springboot)

思路比较简单,实现也简单,要的就是简单! 实际项目中可以此基础上封装

重写UsernamePasswordToken 中 getCredentials() 方法。所以新增了类NoPwdToken

UserRealm类中的 doGetAuthenticationInfo(AuthenticationToken authcToken) 方法执行时,判断参数authcToken的类型如果是NoPwdToken类型,则返回值改为getCredentials()方法对应的验证信息。(即:SimpleHash simpleHash = new SimpleHash("SHA-256", "123456", null, 16);)。

 

1、增加类:NoPwdToken (关键地方是20行重写的方法)

import org.apache.shiro.authc.UsernamePasswordToken;

public class NoPwdToken extends UsernamePasswordToken {

	public NoPwdToken(String username) {
		this.username = username;
	}

	private String username;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	@Override
	public Object getCredentials() {
          //这里和下方的123456对应,也可以别的,一致即可。
		return "123456";
	}
}

 

2、修改UserRealm类中 的 doGetAuthenticationInfo(AuthenticationToken authcToken) 方法。(关键地方是2-13行)

	// 判断是否免密登陆类型
	if (authcToken instanceof NoPwdToken) {
		// 免密登陆
		NoPwdToken token = (NoPwdToken) authcToken;
		SysUserEntity user = sysUserDao.selectByUserName(token.getUsername());
		if (user != null) {
            //这里和上面的123456对应,也可以别的,一致即可。 
			SimpleHash simpleHash = new SimpleHash("SHA-256", "123456", null, 16);
			return new SimpleAuthenticationInfo(user, simpleHash, this.getClass().getSimpleName());
		} else {
			return null;
		}
	} else {
		// 默认的登陆方式
		UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
		user.setUsername(token.getUsername());
	}

 

 

测试:

	/**
	 * 免密登陆
	 */
	@SysLog("免密登陆")
	@ResponseBody
	@RequestMapping(value = "/sys/nopwdlogin")
	public R nopwdlogin(@RequestParam Map<String, String> params, HttpServletRequest req, HttpServletResponse res) {
		String username = params.get("username");

		try {
			if (StringUtil.isBlank(username)) {
				return R.error("用户名不能为空");
			}
			Subject subject = SecurityUtils.getSubject();
			if (null != subject.getPrincipal()) {
				// 已经登陆过的情况
				res.sendRedirect("http://localhost/web/index.html");
				return R.ok().put("user", ShiroUtils.getUserEntity());
			}

			// 使用自定义Token
			NoPwdToken ssoToken = new NoPwdToken(username);
			subject.login(ssoToken);

		} catch (UnknownAccountException e) {
			return R.error(e.getMessage());
		} catch (IncorrectCredentialsException e) {
			return R.error("账号或密码不正确");
		} catch (LockedAccountException e) {
			return R.error("账号已被锁定,请联系管理员");
		} catch (AuthenticationException e) {
			return R.error("账户验证失败");
		} catch (Exception e) {
			return R.error("未知异常");
		}
		SysUserEntity sysUser = ShiroUtils.getUserEntity();
		sysUser.setPassword(null);
		try {
			res.sendRedirect("http://localhost/web/index.html");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return R.ok().put("user", sysUser);
	}

 

发送请求:http://localhost:9000/sys/nopwdlogin?username=yuer

 

 

其他问题:

 1、如果加密类型和上方不同,可以参考 org.apache.shiro.authc.credential.HashedCredentialsMatcher 中 hashProvidedCredentials 方法。断点打在这里就可以看到了,如图


 

2、用户输入密码和实际密码比较方法具体位置在 org.apache.shiro.authc.credential.HashedCredentialsMatcher 中 doCredentialsMatch 方法。如下图:

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
在 Spring Boot 中使用 Shiro 实现免密登录的步骤如下: 1. 导入 Shiro 和 Spring Boot 的相关依赖。在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> <version>1.7.1</version> </dependency> ``` 2. 创建一个自定义的 ShiroRealm 类,并继承 org.apache.shiro.realm.AuthenticatingRealm 类。在该类中重写 doGetAuthenticationInfo 方法,用于验证用户身份信息。这里可以通过用户名和密码进行验证,也可以通过其他方式实现免密登录。 3. 在 application.properties 或 application.yml 文件中配置 Shiro 的相关属性。例如,配置 Shiro 使用的 Realm 类和登录 URL: ```yaml shiro: authc: loginUrl: /login realms: myRealm: authenticationTokenClass: org.apache.shiro.authc.UsernamePasswordToken ``` 4. 在 Spring Boot 的入口类上添加 @EnableShiro 注解,启用 Shiro 功能。 5. 创建一个登录接口,处理用户登录请求。在该接口中,可以使用 Shiro 的 Subject 类来进行登录验证。例如: ```java @PostMapping("/login") public String login(String username, String password) { Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password); try { subject.login(token); return "登录成功"; } catch (AuthenticationException e) { return "用户名或密码错误"; } } ``` 这样,当用户访问登录接口并提供正确的用户名和密码时,就可以实现免密登录,并返回登录成功的提示信息。当用户提供错误的用户名或密码时,将返回错误提示信息。 注意:以上只是简单示例,实际应用中可能需要更复杂的逻辑和安全措施。建议参考 Shiro 的官方文档和示例代码来进行具体的实现和配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuer629

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值