Shiro+SpringBoot认证

该博客以Web为基础java

1、引入依赖

    shiro-all包含shiro全部的包、shiro-core是核心包、shiro-web是与web整合、shiro-spring是与spring整合、shiro-ehcache是与EHCache整合、shiro-quartz是与任务调度quartz整合等等。这里咱们只须要引入shiro-spring便可。web

 

1  https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring -->2 <dependency>3      <groupId>org.apache.shirogroupId>4      <artifactId>shiro-springartifactId>5      <version>1.5.3version>6 dependency>
 2、Controller层
@RestController
@RequestMapping("/account")public class AccountController {
/**
 * 登陆
 * @param username
 * @param password
 * @return
 */
  @PostMapping(path = "/login")
public ResultMsg login(
@RequestParam(value = "aaccount")String username,
            @RequestParam(value = "apassword")String pwd,
            @RequestParam("check") Integer check ) {
        ResultMsg resultMsg = new ResultMsg();
//        获取当前用户
        Subject subject = SecurityUtils.getSubject();
        /**
         * 判断当前用户是否已经认证过
         */
//        System.out.println("是否记住我==="+subject.isRemembered());
        if (!subject.isAuthenticated()) {
//            封装用户的登陆数据
            UsernamePasswordToken token = new UsernamePasswordToken(username,pwd);
            Boolean rememberMe = check == 1 ? true:false;
            System.out.println(rememberMe);
            token.setRememberMe(rememberMe); //记住我
            try {
                subject.login(token); //登陆认证
                resultMsg.setState(200);
                resultMsg.setMsg("登陆成功");
                return resultMsg;
            } catch (UnknownAccountException u) {
                System.err.println("用户不存在");
                resultMsg.setState(412);
                resultMsg.setMsg("用户不存在");
                return resultMsg;
            } catch (IncorrectCredentialsException i) {
                System.err.println("密码错误");
                resultMsg.setState(412);
                resultMsg.setMsg("密码错误");
                return resultMsg;
            } catch (LockedAccountException l) {
                System.err.println("帐户锁定");
                resultMsg.setState(412);
                resultMsg.setMsg("帐户锁定");
                return resultMsg;
            }
        } else {
            resultMsg.setState(403);
            resultMsg.setMsg("此帐户已在其余地方登陆,是否强制下线?");
            return resultMsg;
        }
    }
  
  /**
     * 退出登陆
     * @param num
     * @return
     */
    @GetMapping(path = "/loginout")
public ResultMsg loginOut(Integer num) {
        ResultMsg resultMsg = new ResultMsg();
//        获取当前用户
        Subject subject = SecurityUtils.getSubject();
        subject.logout();//退出当前登陆
        resultMsg.setState(200);
        if (num == 1) {
            resultMsg.setMsg("已下线!");
        } else {
            resultMsg.setMsg("当前用户已退出!");
        }
return resultMsg;

    }
  
  /**
   * 未认证返回登陆页面
   * @return
   */
  @GetMapping(path = "/login")
  public ModelAndView login() {
      ModelAndView mv = new ModelAndView("/user/login");
      return mv;
  }


}
Shiro核心配置

Shiro配置类

ShiroConfig.javaspring

主要建立三大Bean对象数据库

  • ShiroFilterFactoryBean(拦截一切请求)3
  • DefaultSecurityManager(安全管理器)2
  • 自定义Realm 继承 AuthorizingRealm(主要用于认证和受权)1

建议建立顺序逆行apache

package com.hk.aefz.shiro.config;
@Configurationpublic class ShiroConfig {    //    ShiroFliterFactoryBean 3    @Bean    public ShiroFilterFactoryBean getShiroFilterFactoryBean(
            @Qualifier("securityManager") DefaultWebSecurityManager securityManager
    ) {
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();//        设置安全管理器        factoryBean.setSecurityManager(securityManager);//        添加Shiro内置过滤器
    /*
            anon:无需认证就能够访问
            authc:必须认证才能够访问
            user:必须拥有记住我功能才能够访问
            perms:拥有对某个资源的权限才能访问
            role:拥有某个角色权限才能够访问
         */
        Map

自定义Relam类

继承AuthorizingRealm类安全

/**
 * 自定义UserRealm */public class UserRealm extends AuthorizingRealm {//    注入AccountController    @Autowired    private AccountController accountController;

    @Autowired    private UserInfoService userInfoService;

    @Autowired    private AccountService accountService;//    受权    @Override    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        System.err.println("执行了受权.........");return null;
    }//    认证    @Override    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.err.println("执行了认证...........");//        获取当前登陆帐户
        UsernamePasswordToken accountToken = (UsernamePasswordToken) token;
        String username = accountToken.getUsername(); // 获取当前帐号//        链接数据库进行登陆验证
        Account account = accountController.selectByName(username);
        System.out.println(account);        if (account == null) {            return null; //抛出 UnknownAccountException 异常        }//         密码认证 shiro作 存在泄密        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(account, account.getApassword(), account.getAaccount());return info;
    }

}

测试

使用PostMan进行登陆测试app

相关文章
相关标签/搜索