本文共 5195 字,大约阅读时间需要 17 分钟。
Subject是用户代表,任何与应用交互的主体都可视为Subject,包括用户、爬虫、机器人等。它与SecurityManager保持关联,所有安全交互都通过SecurityManager处理。
作为Shiro的核心,SecurityManager管理所有Subject的安全交互,承担身份验证、权限验证等核心任务,类似于Spring MVC中的DispatcherServlet。
Realm是Shiro获取安全数据的源,用来从数据库或其他数据源获取用户的认证信息和权限。它类似于数据源,又类似于Spring中的DataSources。
通过验证用户凭证,确认用户身份的合法性。
确认已认证用户对特定资源的访问权限。
维护用户在应用中的会话信息,支持多种环境的会话管理。
保障敏感数据的安全性,例如密码加密存储。
缓存用户信息等常用数据,提升应用性能。
支持多线程环境下的安全交互,确保多个线程间的权限传播。
org.apache.shiro shiro-spring 1.7.1
配置ShiroFilterFactoryBean、DefaultWebSecurityManager和Realm,通过注解方式管理相关Bean的生命周期。
dest NJ、campusservices、noSession等主要拦截器类别。
@Configurationpublic class ShiroConfig { @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Autowired DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean(); filterFactoryBean.setSecurityManager(securityManager); Map filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/user/add", "authc"); filterChainDefinitionMap.put("/user/update", "authc"); filterChainDefinitionMap.put("/user/*", "authc"); filterChainDefinitionMap.put("/logout", "logout"); filterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); filterFactoryBean.setLoginUrl("/toLogin"); filterFactoryBean.setUnauthorizedUrl("/unauth"); return filterFactoryBean; } @Bean public DefaultWebSecurityManager getDefaultWebSecurityManager(@Autowired UserRealm userRealm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(userRealm); return securityManager; } @Bean public UserRealm userRealm() { return new UserRealm(); }} public class UserRealm extends AuthorizingRealm { @Autowired private UserService userService; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); Subject currentUser = SecurityUtils.getSubject(); String username = currentUser.getPrincipal().toString(); User user = userService.getByUsername(username); if (!StringUtils.isBlank(user.getPerm())) { String[] perms = user.getPerm().split(","); List permList = new ArrayList<>(); Collections.addAll(permList, perms); authorizationInfo.addStringPermissions(permList); } return authorizationInfo; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken wpToken = (UsernamePasswordToken) token; String username = wpToken.getUsername(); User user = userService.getByUsername(username); if (user == null) { throw new UnknownAccountException(username); } return new SimpleAuthenticationInfo(username, user.getPassword(), ""); }} @Controllerpublic class MyController { @RequestMapping("/toLogin") public String toLogin() { return "login"; } @RequestMapping({"/", "/index"}) public String toIndex(Model model) { model.addAttribute("msg", "Hello,Shiro"); return "index"; } @RequestMapping("/user/add") public String addUser() { return "user/add"; } @RequestMapping("/user/update") public String updateUser() { return "user/update"; } @PostMapping("/login") public String login(String username, String password, Model model) { UsernamePasswordToken token = new UsernamePasswordToken(username, password); Subject currentUser = SecurityUtils.getSubject(); try { currentUser.login(token); Session session = currentUser.getSession(); session.setAttribute("username", username); return "index"; } catch (UnknownAccountException uae) { model.addAttribute("msg", token.getPrincipal() + "用户名不匹配"); return "login"; } catch (IncorrectCredentialsException ice) { model.addAttribute("msg", token.getPrincipal() + "密码错误"); return "login"; } } @ResponseBody @RequestMapping("/unauth") public String unAuth() { return "未经授权"; } @RequestMapping("/logout") public String logout() { return "/login"; }} 通过配置RememberMe cookie,实现用户自动登录功能。
com.github.theborakompanioni thymeleaf-extras-shiro 2.0.0
管理员界面具有更新权限的用户可以访问
配置完成后,依次访问各资源,观察Shiro的拦截和授权效果,验证配置是否正确。
通过以上步骤,你可以完成Spring Boot与Shiro的成功集成,实现用户认证、权限管理和记住我等功能,同时结合Thymeleaf实现动态页面展示。
转载地址:http://hcbmz.baihongyu.com/