这篇文章主要讲解了Springboot+Shiro如何实现记录用户登录信息并获取当前登录用户信息,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
由于最近做项目需要,在用户登陆后有一个功能是需要用户的信息,进行写入数据库的操作。但是目前还用不到Shiro的高级权限,只为了简单获取用户信息,自己整合了一个只记录用户,获取用户信息的功能。
导入Shiro依赖
<!-- Shiro --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency>
User类
这个类只需要自己定义一个username(可以其他的phone、email都行)和password(密码)就可以,其他的可以自己扩充。
UserRealm(核心)
这个类的功能:
1、用户的授权操作,但是这里先不授予权限(后续可以在这里补充)
2、用户认证,这里有三种认证结果。
① 用户登录成功
② 抛出UnknownAccountException异常,表示获取的user是null 。
③ 抛出IncorrectCredentialsException异常,表示这个user的密码错误。
import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; /** * 自定义Realm */ public class UserRealm extends AuthorizingRealm { @Autowired(required = false) private UserService userService; private final Logger logger = LoggerFactory.getLogger(UserRealm.class); /** * 执行授权逻辑 * * @param arg0 * @return */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) { System.out.println("执行授权逻辑"); //给资源进行授权 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //不授权先不写 return info; } /** * 执行认证逻辑 * * @param arg0 * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException { System.out.println("执行认证逻辑"); // 编写shiro判断逻辑,判断用户名和密码 UsernamePasswordToken token = (UsernamePasswordToken) arg0; // 判断用户名 User user = userService.findUserByPhone(token.getUsername()); if (user == null) { // 该用户不存在 return null; // shiro底层会抛出UnKnowAccountException } return new SimpleAuthenticationInfo(user, user.getPassword(), ""); // 判断密码 } }
ShiroConfig类(核心)
代码基本不需要修改,根据个人不同的情况,需要修改的地方是第一个方法。
这里修改的原因是,每个人想要拦截的页面都不一样。因为我没有做任何的授权,我使用了
filterMap.put("/*", "anon");
为所有的页面,都开启了放行,无需认证就可以访问,代码中注释部分是权限的定义
import java.util.LinkedHashMap; import java.util.Map; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Shiro的配置类 */ @Configuration public class ShiroConfig { /** * 创建ShiroFilterFactoryBean * * @param securityManager * @return */ @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>(); // 放行login.html页面 filterMap.put("/login", "anon"); // 要将登陆的接口放出来,不然没权限访问登陆的接口 // 授权过滤器 // 注意:当前授权拦截后,shiro会自动跳转到未授权页面 filterMap.put("/*", "anon"); // TODO 此处我做过修改 shiroFilterFactoryBean.setLoginUrl("/login"); // 修改调整的登录页面 shiroFilterFactoryBean.setUnauthorizedUrl("/403"); // 设置未授权提示页面 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap); return shiroFilterFactoryBean; } /** * 创建DefaultWebSecurityManager * * @param userRealm * @return */ @Bean(name = "securityManager") public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(userRealm); // 关联realm return securityManager; } /** * 创建Realm * * @return */ @Bean(name = "userRealm") public UserRealm getRealm() { return new UserRealm(); } }
UserController类(用户登录)
这里就是登陆成功,以及抛出两个异常的地方。
/** * 用户登录 * * @param request * @return */ @PostMapping("/userLogin") @ResponseBody public String userLogin(HttpServletRequest request) { String phone = request.getParameter("phone"); String password = request.getParameter("password"); String result = ""; Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(phone, password); try { subject.login(token); result = "登陆成功"; } catch (UnknownAccountException e) { result = "用户名不存在"; } catch (IncorrectCredentialsException e) { result = "密码错误"; } return result; }
这样就完成了记录用户登录信息,并且完成登录。
唯一有可能遇到的问题是网页的问题,这里需要在ShiroConfig类第一个方法里去配置。
获取当前用户登录信息
只需要这一条语句就可以
User user = (User) SecurityUtils.getSubject().getPrincipal(); // 获取当前登录用户
看完上述内容,是不是对Springboot+Shiro如何实现记录用户登录信息并获取当前登录用户信息有进一步的了解,如果还想学习更多内容,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。