SpringBoot整合Shiro实现帐号密码登陆

shiro安全框架简介

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、受权、密码和会话管理。java

三个核心组件:Subject, SecurityManager 和 Realms.spring

  • Subject:表明了当前用户的安全操做,SecurityManager则管理全部用户的安全操做。
  • SecurityManager:它是Shiro框架的核心,Shiro经过SecurityManager来管理内部组件实例,并经过它来提供安全管理的各类服务。
  • Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“链接器”。当对用户执行认证(登陆)和受权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。Realm实质上是一个安全相关的DAO:它封装了数据源的链接细节,并在须要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)受权。
  • 导入依赖(pom.xml) 

        <!--整合Shiro安全框架--><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.0</version></dependency><!--集成jwt实现token认证--><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.2.0</version></dependency>
  • 建立 ShiroConfig 配置类

@Configurationpublic class ShiroConfig {/** * ShiroFilterFactoryBean     */@Beanpublic ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager) {
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();//设置安全管理器        factoryBean.setSecurityManager(defaultWebSecurityManager);// 添加shiro的内置过滤器/* *  anon:无需认证就能够访问
         *  authc:必须认证才能访问
         *  user:必须拥有 记住我 功能才能用
         *  perms:拥有对某个资源的权限能访问
         *  role:拥有某个角色权限能访问         */Map<String, String> filterMap = new LinkedHashMap<>();// 放行不须要权限认证的接口//放行登陆接口filterMap.put("/login/**", "anon");//放行用户接口filterMap.put("/", "anon");             // 网站首页  //认证管理员接口filterMap.put("/administrators/**", "authc");
        factoryBean.setFilterChainDefinitionMap(filterMap);// 设置无权限时跳转的 url// 设置登陆的请求factoryBean.setLoginUrl("/login/toLogin");return factoryBean;
    }/** * 注入 DefaultWebSecurityManager     */@Bean(name = "securityManager")public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("customRealm") CustomRealm customRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();//关联CustomRealm        securityManager.setRealm(customRealm);return securityManager;
    }/** * 注入 securityManager     */@Beanpublic CustomRealm customRealm() {return new CustomRealm();
    }

}
  • 建立密码登陆时验证受权 CustomRealm 类

@Componentpublic class CustomRealm extends AuthorizingRealm {

    @Autowired
    AdministratorsService administratorsService;/* * 设置加密方式     */{
        HashedCredentialsMatcher mather = new HashedCredentialsMatcher();// 加密方式mather.setHashAlgorithmName("md5");// 密码进行一次运算mather.setHashIterations(512);this.setCredentialsMatcher(mather);
    }/** * 受权     */@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        System.out.println("————受权————doGetAuthorizationInfo————");return null;
    }/** * 认证     */@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("————认证————doGetAuthenticationInfo————");

        UsernamePasswordToken userToken = (UsernamePasswordToken) token;// 链接数据库  查询用户数据QueryWrapper<Administrators> wrapper = new QueryWrapper<>();
        wrapper.eq("username", userToken.getUsername());
        Administrators administrators = administratorsService.getOne(wrapper);if (administrators == null) {return null;  // 抛出异常 UnknownAccountException        }// 密码认证,shiro作return new SimpleAuthenticationInfo("", administrators.getPassword(), "");
    }

}
  • 控制层用户密码登陆

//用户名登陆@ApiOperation(value = "管理员登陆", notes = "用户名登陆--不进行拦截")
    @PostMapping("/doLogin")public String doLogin(@RequestParam("username") String username,
                          @RequestParam("password") String password,
                          HttpSession session,Model model) {// 获取当前的用户Subject subject = SecurityUtils.getSubject();// 封装用户的登陆数据UsernamePasswordToken token = new UsernamePasswordToken(username, password);try {
            subject.login(token);//保存session会话 管理员名字session.setAttribute("adname", username);return "admin";
        } catch (UnknownAccountException e) {
            model.addAttribute("usererror", "用户名错误!请从新输入。");return "login";
        } catch (IncorrectCredentialsException ice) {
            model.addAttribute("pwerror", "密码错误!请从新输入。");return "login";
        }
    }

SpringBoot 整合 Shiro 密码登陆

相关文章
相关标签/搜索