shiro框架学习笔记(3)---使用shiro完成登陆认证

  在shiro框架中,未登录就是未认证,登陆了才算认证,认证后只能使用一些基本权限,使用更多的权限需要授权,认证和授权是不同的概念。

一、UserAction中的相关代码

public String login(){
		
		//从Session中获取生成的验证码
		String validatecode = (String) ServletActionContext.getRequest().getSession().getAttribute("key");
		//校验验证码是否输入正确
		if(StringUtils.isNotBlank(checkcode) && checkcode.equals(validatecode)){
			System.out.println(user.getPassword()+user.getUsername());
			//输入的验证码正确
			//使用shiro框架提供的方式进行认证授权
			Subject subject = SecurityUtils.getSubject();//获得当前用户,状态为未认证
			AuthenticationToken token = new UsernamePasswordToken(user.getUsername(),user.getPassword());//创建用户名密码令牌对象
			try{
				subject.login(token);//调用login
			}catch(Exception e){
				this.addActionError("输入的账号或密码错误!");
				e.printStackTrace();
				return LOGIN;
			}
			//没有异常,验证正确,将查询到的user存入session
			//通过subject对象获得绑定在线程上的user
			User getUser = (User) subject.getPrincipal();
			ServletActionContext.getRequest().getSession().setAttribute("loginUser", getUser);
			return "home";
		}else{
			//输入的验证码错误,设置提示信息,跳转到登录页面
			this.addActionError("输入的验证码错误!");
			return LOGIN;
		}
	}

未认证时会调用这段登陆的代码,需要在这段代码中加入shiro框架,通过SecurityUtils调用当前用户,并且注册一个认证令牌

AuthenticationToken ,将用户输入的用户密码保存在令牌中,接着调用当前用户的login方法,传入令牌,接着程序通过applicationContext.xml中配置的realm

二、数据桥梁realm的代码:

public class BOSRealm extends AuthorizingRealm{
	@Autowired
	private UserDao userDao;
	
	/**
	 *认证方法
	 */
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		System.out.println("认证方法已经执行");
		//根据用户名查询数据库中的密码,框架负责比对数据库中的密码和页面输入的密码是否一致
		UsernamePasswordToken tk = (UsernamePasswordToken) token;
		//获得用户名
		String username = tk.getUsername();
		//根据用户名查询数据库
		User user = userDao.findUserByUsername(username);
		if(user == null){
			//用户名不存在
			return null;
		}
		//简单认证信息对象
		AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());
		//框架负责比对数据库中的密码和页面输入的密码是否一致
		return info;
	}
	
	/**
	 * 授权方法
	 */
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection args){
		
		return null;
	}

}

如果账号不存在或者密码错误,都会报相应的错误,通过struts.xml定义全局异常捕捉就可以返回相应的页面或文字

猜你喜欢

转载自blog.csdn.net/pbrlovejava/article/details/81123479