在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定义全局异常捕捉就可以返回相应的页面或文字