1.首先自定义一个realm类,这个类需要继承FormAuthenticationFilter
public class MyFormAuthenticationFilte extends FormAuthenticationFilter{@Overrideprotected 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>
本文介绍如何使用Shiro进行自定义登录流程及异常处理,并提供了具体实现的代码示例,包括自定义Realm类、登录后异常处理逻辑及Shiro配置文件的修改。

1万+

被折叠的 条评论
为什么被折叠?



