package com.chint.mqc.controller; import com.chint.mqc.entity.ResultInfo; import com.chint.mqc.entity.User; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.*; import org.apache.shiro.subject.Subject; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import javax.validation.Valid; @Controller public class LoginController { @RequestMapping(value="/login") public @ResponseBody ResultInfo login(@Valid User user, BindingResult bindingResult,RedirectAttributes redirectAttributes){ ResultInfo info = new ResultInfo(); info.setCode(1); if(bindingResult.hasErrors()){ return info; } UsernamePasswordToken token = new UsernamePasswordToken(user.getLoginName(), user.getPwd()); //获取当前的Subject Subject currentUser = SecurityUtils.getSubject(); try { //在调用了login方法后,SecurityManager会收到AuthenticationToken,并将其发送给已配置的Realm执行必须的认证检查 //每个Realm都能在必要时对提交的AuthenticationTokens作出反应 //所以这一步在调用login(token)方法时,它会走到MyRealm.doGetAuthenticationInfo()方法中,具体验证方式详见此方法 //logger.info("对用户[" + username + "]进行登录验证..验证开始"); currentUser.login(token); info.setCode(0); // logger.info("对用户[" + username + "]进行登录验证..验证通过"); }catch(UnknownAccountException uae){ // logger.info("对用户[" + username + "]进行登录验证..验证未通过,未知账户"); info.setMsg( "未知账户"); // redirectAttributes.addFlashAttribute("message", "未知账户"); }catch(IncorrectCredentialsException ice){ // logger.info("对用户[" + username + "]进行登录验证..验证未通过,错误的凭证"); info.setMsg( "密码不正确"); // redirectAttributes.addFlashAttribute("message", "密码不正确"); }catch(LockedAccountException lae){ // logger.info("对用户[" + username + "]进行登录验证..验证未通过,账户已锁定"); info.setMsg( "账户已锁定"); // redirectAttributes.addFlashAttribute("message", "账户已锁定"); }catch(ExcessiveAttemptsException eae){ //logger.info("对用户[" + username + "]进行登录验证..验证未通过,错误次数过多"); info.setMsg( "用户名或密码错误次数过多"); // redirectAttributes.addFlashAttribute("message", "用户名或密码错误次数过多"); }catch(AuthenticationException ae){ //通过处理Shiro的运行时AuthenticationException就可以控制用户登录失败或密码错误时的情景 //logger.info("对用户[" + username + "]进行登录验证..验证未通过,堆栈轨迹如下"); info.setMsg( "用户名或密码不正确"); ae.printStackTrace(); // redirectAttributes.addFlashAttribute("message", "用户名或密码不正确"); } //验证是否登录成功 if(currentUser.isAuthenticated()){ //logger.info("用户[" + username + "]登录认证通过(这里可以进行一些认证通过后的一些系统参数初始化操作)"); info.setCode(0); return info; }else{ token.clear(); info.setCode(1); return info; } } @RequestMapping(value="/logout",method=RequestMethod.GET) public String logout(RedirectAttributes redirectAttributes ){ //使用权限管理工具进行用户的退出,跳出登录,给出提示信息 SecurityUtils.getSubject().logout(); redirectAttributes.addFlashAttribute("message", "您已安全退出"); return "redirect:/login"; } }
shiro 登录
猜你喜欢
转载自www.cnblogs.com/newlangwen/p/9024101.html
今日推荐
周排行