Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、受权、密码学和会话管理。使用Shiro的易于理解的API,您能够快速、轻松地得到任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。html
Apache Shiro 体系结构
一、Authentication 认证 ---- 用户登陆
二、Authorization 受权 --- 用户具备哪些权限
三、Cryptography 安全数据加密
四、Session Management 会话管理
五、Web Integration web系统集成
六、Interations 集成其它应用,spring、缓存框架java
一、导入对应的依赖
若是须要链接数据库的话,别忘记导入相应的坐标。程序员
这里先看一眼对应的目录结构
二、编写controller类
在controller类里面咱们能够测试thymeleafweb
@RequestMapping("/testThymeleaf") public String testThymeleaf(Model model){ //把数据存入model model.addAttribute("name", "黑马程序员"); //返回test.html return "test"; }
对应的主题部分:spring
/** * 登陆逻辑处理 */ @RequestMapping("/login") public String login(String name,String password,Model model){ System.out.println("name="+name); /** * 使用Shiro编写认证操做 */ //1.获取Subject Subject subject = SecurityUtils.getSubject(); //2.封装用户数据 UsernamePasswordToken token = new UsernamePasswordToken(name,password); //3.执行登陆方法 try { subject.login(token); //登陆成功 //跳转到test.html return "redirect:/testThymeleaf"; } catch (UnknownAccountException e) { //e.printStackTrace(); //登陆失败:用户名不存在 model.addAttribute("msg", "用户名不存在"); return "login"; }catch (IncorrectCredentialsException e) { //e.printStackTrace(); //登陆失败:密码错误 model.addAttribute("msg", "密码错误"); return "login"; } }
三、Spring Boot与Shiro整合实现用户认证
3.1分析Shiro的核心API
Subject: 用户主体(把操做交给SecurityManager)
SecurityManager:安全管理器(关联Realm)
Realm:Shiro链接数据的桥梁
3.2自定义Realm类数据库
public class UserRealm extends AuthorizingRealm{ /** * 执行受权逻辑 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) { System.out.println("执行受权逻辑"); //给资源进行受权 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //添加资源的受权字符串 //info.addStringPermission("user:add"); //到数据库查询当前登陆用户的受权字符串 //获取当前登陆用户 Subject subject = SecurityUtils.getSubject(); User user = (User)subject.getPrincipal(); User dbUser = userSerivce.findById(user.getId()); info.addStringPermission(dbUser.getPerms()); return info; } @Autowired private UserService userSerivce; /** * 执行认证逻辑 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException { System.out.println("执行认证逻辑"); //编写shiro判断逻辑,判断用户名和密码 //1.判断用户名 UsernamePasswordToken token = (UsernamePasswordToken)arg0; User user = userSerivce.findByName(token.getUsername()); if(user==null){ //用户名不存在 return null;//shiro底层会抛出UnKnowAccountException } //2.判断密码 return new SimpleAuthenticationInfo(user,user.getPassword(),""); }
3.3编写Shiro配置类(*)缓存
@Configuration public class ShiroConfig { /** * 建立ShiroFilterFactoryBean */ @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager){ ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); //设置安全管理器 shiroFilterFactoryBean.setSecurityManager(securityManager); //添加Shiro内置过滤器 /** * Shiro内置过滤器,能够实现权限相关的拦截器 * 经常使用的过滤器: * anon: 无需认证(登陆)能够访问 * authc: 必须认证才能够访问 * user: 若是使用rememberMe的功能能够直接访问 * perms: 该资源必须获得资源权限才能够访问 * role: 该资源必须获得角色权限才能够访问 */ Map<String,String> filterMap = new LinkedHashMap<String,String>(); /*filterMap.put("/add", "authc"); filterMap.put("/update", "authc");*/ filterMap.put("/testThymeleaf", "anon"); //放行login.html页面 filterMap.put("/login", "anon"); //受权过滤器 //注意:当前受权拦截后,shiro会自动跳转到未受权页面 filterMap.put("/add", "perms[user:add]"); filterMap.put("/update", "perms[user:update]"); filterMap.put("/*", "authc"); //修改调整的登陆页面 shiroFilterFactoryBean.setLoginUrl("/toLogin"); //设置未受权提示页面 shiroFilterFactoryBean.setUnauthorizedUrl("/noAuth"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap); return shiroFilterFactoryBean; } /** * 建立DefaultWebSecurityManager */ @Bean(name="securityManager") public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); //关联realm securityManager.setRealm(userRealm); return securityManager; } /** * 建立Realm */ @Bean(name="userRealm") public UserRealm getRealm(){ return new UserRealm(); } /** * 配置ShiroDialect,用于thymeleaf和shiro标签配合使用 */ @Bean public ShiroDialect getShiroDialect(){ return new ShiroDialect(); }
3.4使用Shiro内置过滤器实现页面拦截
代码见上块。。。
3.5实现用户认证(登陆)操做安全
<!DOCTYPE html> <html xmlns:th="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>登陆页面</title> </head> <body> <h3>登陆</h3> <h3 th:text="${msg}" style="color: red"></h3> <form method="post" action="login"> 用户名:<input type="text" name="name"/><br/> 密码:<input type="password" name="password"/><br/> <input type="submit" value="登陆"/> </form> </body> </html>
至于service层和mapper层,这里不在赘述!
须要源码的能够在个人csdn里面进行留言!!!网络