shiro 登录

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";
    }
}

猜你喜欢

转载自www.cnblogs.com/newlangwen/p/9024101.html