Springboot+Shiro记录用户登录信息并获取当前登录用户信息的实现代码
由于最近做项目需要,在用户登陆后有一个功能是需要用户的信息,进行写入数据库的操作。但是目前还用不到Shiro的高级权限,只为了简单获取用户信息,自己整合了一个只记录用户,获取用户信息的功能。
导入Shiro依赖
org.apache.shiro shiro-spring 1.4.0
User类
这个类只需要自己定义一个username(可以其他的phone、email都行)和password(密码)就可以,其他的可以自己扩充。
UserRealm(核心)
这个类的功能:
1、用户的授权操作,但是这里先不授予权限(后续可以在这里补充)
2、用户认证,这里有三种认证结果。
①用户登录成功
②抛出UnknownAccountException异常,表示获取的user是null。
③抛出IncorrectCredentialsException异常,表示这个user的密码错误。
importorg.apache.shiro.authc.AuthenticationException; importorg.apache.shiro.authc.AuthenticationInfo; importorg.apache.shiro.authc.AuthenticationToken; importorg.apache.shiro.authc.SimpleAuthenticationInfo; importorg.apache.shiro.authc.UsernamePasswordToken; importorg.apache.shiro.authz.AuthorizationInfo; importorg.apache.shiro.authz.SimpleAuthorizationInfo; importorg.apache.shiro.realm.AuthorizingRealm; importorg.apache.shiro.subject.PrincipalCollection; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; importorg.springframework.beans.factory.annotation.Autowired; /** *自定义Realm */ publicclassUserRealmextendsAuthorizingRealm{ @Autowired(required=false) privateUserServiceuserService; privatefinalLoggerlogger=LoggerFactory.getLogger(UserRealm.class); /** *执行授权逻辑 * *@paramarg0 *@return */ @Override protectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionarg0){ System.out.println("执行授权逻辑"); //给资源进行授权 SimpleAuthorizationInfoinfo=newSimpleAuthorizationInfo(); //不授权先不写 returninfo; } /** *执行认证逻辑 * *@paramarg0 *@return *@throwsAuthenticationException */ @Override protectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokenarg0)throwsAuthenticationException{ System.out.println("执行认证逻辑");//编写shiro判断逻辑,判断用户名和密码 UsernamePasswordTokentoken=(UsernamePasswordToken)arg0;//判断用户名 Useruser=userService.findUserByPhone(token.getUsername()); if(user==null){//该用户不存在 returnnull;//shiro底层会抛出UnKnowAccountException } returnnewSimpleAuthenticationInfo(user,user.getPassword(),"");//判断密码 } }
ShiroConfig类(核心)
代码基本不需要修改,根据个人不同的情况,需要修改的地方是第一个方法。
这里修改的原因是,每个人想要拦截的页面都不一样。因为我没有做任何的授权,我使用了
filterMap.put("/*","anon");
为所有的页面,都开启了放行,无需认证就可以访问,代码中注释部分是权限的定义
importjava.util.LinkedHashMap; importjava.util.Map; importorg.apache.shiro.spring.web.ShiroFilterFactoryBean; importorg.apache.shiro.web.mgt.DefaultWebSecurityManager; importorg.springframework.beans.factory.annotation.Qualifier; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; /** *Shiro的配置类 */ @Configuration publicclassShiroConfig{ /** *创建ShiroFilterFactoryBean * *@paramsecurityManager *@return */ @Bean publicShiroFilterFactoryBeangetShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManagersecurityManager){ ShiroFilterFactoryBeanshiroFilterFactoryBean=newShiroFilterFactoryBean(); //设置安全管理器 shiroFilterFactoryBean.setSecurityManager(securityManager); //添加Shiro内置过滤器 /** *Shiro内置过滤器,可以实现权限相关的拦截器 *常用的过滤器: *anon:无需认证(登录)可以访问 *authc:必须认证才可以访问 *user:如果使用rememberMe的功能可以直接访问 *perms:该资源必须得到资源权限才可以访问 *role:该资源必须得到角色权限才可以访问 */ MapfilterMap=newLinkedHashMap (); //放行login.html页面 filterMap.put("/login","anon");//要将登陆的接口放出来,不然没权限访问登陆的接口 //授权过滤器 //注意:当前授权拦截后,shiro会自动跳转到未授权页面 filterMap.put("/*","anon"); //TODO此处我做过修改 shiroFilterFactoryBean.setLoginUrl("/login");//修改调整的登录页面 shiroFilterFactoryBean.setUnauthorizedUrl("/403");//设置未授权提示页面 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap); returnshiroFilterFactoryBean; } /** *创建DefaultWebSecurityManager * *@paramuserRealm *@return */ @Bean(name="securityManager") publicDefaultWebSecurityManagergetDefaultWebSecurityManager(@Qualifier("userRealm")UserRealmuserRealm){ DefaultWebSecurityManagersecurityManager=newDefaultWebSecurityManager(); securityManager.setRealm(userRealm);//关联realm returnsecurityManager; } /** *创建Realm * *@return */ @Bean(name="userRealm") publicUserRealmgetRealm(){ returnnewUserRealm(); } }
UserController类(用户登录)
这里就是登陆成功,以及抛出两个异常的地方。
/** *用户登录 * *@paramrequest *@return */ @PostMapping("/userLogin") @ResponseBody publicStringuserLogin(HttpServletRequestrequest){ Stringphone=request.getParameter("phone"); Stringpassword=request.getParameter("password"); Stringresult=""; Subjectsubject=SecurityUtils.getSubject(); UsernamePasswordTokentoken=newUsernamePasswordToken(phone,password); try{ subject.login(token); result="登陆成功"; }catch(UnknownAccountExceptione){ result="用户名不存在"; }catch(IncorrectCredentialsExceptione){ result="密码错误"; } returnresult; }
这样就完成了记录用户登录信息,并且完成登录。
唯一有可能遇到的问题是网页的问题,这里需要在ShiroConfig类第一个方法里去配置。
获取当前用户登录信息
只需要这一条语句就可以
Useruser=(User)SecurityUtils.getSubject().getPrincipal();//获取当前登录用户
到此这篇关于Springboot+Shiro记录用户登录信息并获取当前登录用户信息的文章就介绍到这了,更多相关Springboot+Shiro用户登录信息内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。