该博客以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核心配置
ShiroConfig.javaspring
主要建立三大Bean对象数据库
建议建立顺序逆行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
继承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