shiro的认证代码实现

首先:回顾一下流程。(前提,我们已经搭建好了spring和shiro集成,可以参考:shiro和spring的集成(详细步骤)

1. 获取当前的 Subject. 调用 SecurityUtils.getSubject();
2. 测试当前的用户是否已经被认证. 即是否已经登录. 调用 Subject 的 isAuthenticated() 
3. 若没有被认证, 则把用户名和密码封装为 UsernamePasswordToken 对象
(对于b/s项目 如何获取用户名和密码)
1). 创建一个表单页面
2). 把请求提交到 SpringMVC 的 Handler
3). 获取用户名和密码. 
4. 执行登录: 调用 Subject 的 login(AuthenticationToken) 方法. 
5. 自定义 Realm 的方法, 从数据库中获取对应的记录, 返回给 Shiro.
1). 实际上需要继承 org.apache.shiro.realm.AuthenticatingRealm 类
2). 实现 doGetAuthenticationInfo(AuthenticationToken) 方法. 
6. 由 shiro 完成对密码的比对. 


具体代码实现流程:

1.首先是shiroHandler 也就是controller 层

package com.atguigu.shiro.handler;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/shiro")
public class shiroHandler {

	@RequestMapping("/login")
	public String login(@RequestParam("username") String username, @RequestParam("password") String password) {
		Subject currentUser = SecurityUtils.getSubject();
		if (!currentUser.isAuthenticated()) {
			// 把用户名和密码封装为 UsernamePasswordToken 对象
			UsernamePasswordToken token = new UsernamePasswordToken(username, password);
			// rememberme
			token.setRememberMe(true);
			try {
				// 执行登录.
				currentUser.login(token);
			}
			// 所有认证时异常的父类.
			catch (AuthenticationException ae) {
				System.out.println("登陆失败:"+ae.getMessage());
			}
		}
		return "redirect:/list.jsp";
	}
}


2. ShiroRealm的编写
package com.atguigu.shiro.realms;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.realm.AuthenticatingRealm;
import org.apache.shiro.realm.Realm;

public class ShiroRealm extends AuthenticatingRealm {

	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		//1.把AuthenticationToken转换 为 UsernamePasswordToken 的token
		UsernamePasswordToken upToken = (UsernamePasswordToken)token;
		//2。从UsernamePasswordToken 中 获取 username
		String username = upToken.getUsername();
		//3. 调用数据库的方法,从数据库中查询username 对应的用户记录
		System.out.println("从数据库中查询username的相关信息:"+username);
		//4. 若用户不存在, 则可以抛出 UnknownAccountException异常
		if("unknown".equals(username)){
			throw new UnknownAccountException("用户不存在");
		}
		//5.根据用户信息的情况, 决定是否需要抛出其他的 AuthenticationException
		if("monster".equals(username)){
			throw new AuthenticationException("用户被锁定");
		}
		//6.根据用户的情况,来构建 AuthenticationInfo 对象并返回,通常使用的实现类为: SimpleAuthenticationInfo
		//以下信息是从数据库中获取的
		//1). principal:认证的实体信息. 可以是username , 也可以是数据表对应的用户的实体类对象
		Object principal = username;
		//2). credentials : 密码
		Object credentials = "123456";
		//3) realmName: 当前realm 对象的name.  调用父类的getName() 方法即可.
		String realmName = getName();
		SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(principal, credentials, realmName);
		
		return info;
	}
}

3.login.jsp 页面

	<h4>Login Page</h4>
	<form action="shiro/login" method="post">
		username: <input name="username" type="text"><br>
		password: <input name="password" type="text"><br> <input
			type="submit" value="提交">
	</form>





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 Shiro 实现登录安全认证的示例代码: 1. 添加 Shiro 依赖 在项目的 pom.xml 文件中添加 Shiro 的依赖: ```xml <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.7.1</version> </dependency> ``` 2. 配置 Shiro 在应用程序中配置 Shiro,包括安全认证的过滤器、realm、密码加密等。这里使用 INI 配置文件进行配置。 shiro.ini 文件内容如下: ```ini [main] # 配置自定义 Realm myRealm = com.example.MyRealm securityManager.realm = $myRealm # 配置密码加密方式 credentialsMatcher = org.apache.shiro.authc.credential.HashedCredentialsMatcher credentialsMatcher.hashAlgorithmName = MD5 credentialsMatcher.hashIterations = 1 myRealm.credentialsMatcher = $credentialsMatcher [users] # 配置用户信息 admin = 123456, admin [urls] # 配置受保护的 URL 路径 /login = anon /logout = logout /** = authc ``` 3. 实现自定义 Realm 实现自定义 Realm 来实现用户认证信息的获取和验证。这里使用 IniRealm 实现。 MyRealm.java 文件内容如下: ```java import org.apache.shiro.realm.text.IniRealm; public class MyRealm extends IniRealm { public MyRealm() { super("classpath:shiro.ini"); } } ``` 4. 实现登录功能 在登录页面中获取用户输入的用户名和密码,然后将其传递给 Shiro 进行认证。这里使用 UsernamePasswordToken 来封装用户信息。 LoginController.java 文件内容如下: ```java import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class LoginController { @RequestMapping(value = "/login", method = RequestMethod.POST) public String login(String username, String password, Model model) { Subject currentUser = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password); try { currentUser.login(token); return "redirect:/index"; } catch (AuthenticationException e) { model.addAttribute("error", "用户名或密码错误"); return "login"; } } } ``` 5. 配置登录页面 在 Shiro 的过滤器中配置登录页面的访问路径,当用户未登录时自动跳转到登录页面。这里使用 Thymeleaf 模板引擎实现。 login.html 文件内容如下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录</title> </head> <body> <h1>登录</h1> <div th:if="${error}"> <p th:text="${error}"></p> </div> <form method="post" action="/login"> <label for="username">用户名:</label> <input type="text" id="username" name="username" required> <br> <label for="password">密码:</label> <input type="password" id="password" name="password" required> <br> <button type="submit">登录</button> </form> </body> </html> ``` 6. 实现注销功能 在应用程序中实现用户注销功能,同时清空用户的会话信息。这里使用 Shiro 提供的 Subject.logout() 方法实现。 LogoutController.java 文件内容如下: ```java import org.apache.shiro.SecurityUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class LogoutController { @RequestMapping(value = "/logout", method = RequestMethod.GET) public String logout() { SecurityUtils.getSubject().logout(); return "redirect:/login"; } } ``` 通过以上步骤,就可以使用 Shiro 实现登录安全认证功能。具体实现的细节可以参考 Shiro 的官方文档或者相关的教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值