1.首先自定义一个realm类,这个类需要继承
FormAuthenticationFilter
public class MyFormAuthenticationFilte extends FormAuthenticationFilter{
@Override
protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request,
ServletResponse response) throws Exception {
//清楚缓存
WebUtils.getAndClearSavedRequest(request);
subject = SecurityUtils.getSubject();
//取身份信息
ActiveUser activeUser = (ActiveUser) subject.getPrincipal();
//管理员登录入口
if(activeUser.getRoleid()==3){
WebUtils.redirectToSavedRequest(request, response, "/admindex");
return false;
//老师入口
}else if(activeUser.getRoleid()==2){
WebUtils.redirectToSavedRequest(request, response, "/loginvalue.action");
return false;
//学生管理入口
}else if(activeUser.getRoleid()==1)
WebUtils.redirectToSavedRequest(request, response, "/loginvalue.action");
return false;
}
}
2.这个是登录后对异常的处理
//登陆提交地址,和applicationContext-shiro.xml中配置的loginurl一致
@RequestMapping("login")
public String login(HttpServletRequest request)throws Exception{
//如果登陆失败从request中获取认证异常信息,shiroLoginFailure就是shiro异常类的全限定名
String exceptionClassName = (String) request.getAttribute("shiroLoginFailure");
//根据shiro返回的异常类路径判断,抛出指定异常信息
if(exceptionClassName!=null){
if (UnknownAccountException.class.getName().equals(exceptionClassName)) {
//最终会抛给异常处理器
throw new CustomException("账号不存在");
} else if (IncorrectCredentialsException.class.getName().equals(
exceptionClassName)) {
throw new CustomException("用户名/密码错误");
} else {
throw new Exception();//最终在异常处理器生成未知错误
}
}
//此方法不处理登陆成功(认证成功),shiro认证成功会自动跳转到上一个请求路径
//登陆失败还到login页面
return "forward:/index.jsp";
}
3,增加shiro 的配置文件
<property name="filters">
<map>
<!-- 将自定义 的FormAuthenticationFilter注入shiroFilter中-->
<entry key="authc" value-ref="myFormAuthenticationFilte" />
</map>
</property>