shiro实现登录和登出

您所在的位置:网站首页 shiro加密算法 shiro实现登录和登出

shiro实现登录和登出

2023-02-27 02:18| 来源: 网络整理| 查看: 265

shiro实现登录与登出 CustomRealm public class CustomRealm extends AuthorizingRealm{ //设置realm的名称 @Override public void setName(String name) { super.setName("customRealm");; } //用于认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // TODO Auto-generated method stub //token是用户输入的 //第一步从token中取出身份信息 String userCode = (String)token.getPrincipal(); //第二步:根据用户输入的userCode从数据库查询 //... //模拟从数据库查询密码 String password = "111111"; //如果查询不到返回null //数据库中用户账号是zhangsan if(!userCode.equals("zhangsan")) { return null; } //如果查询到返回认证信息AuthenticationInfo SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(userCode, password,this.getName()); return simpleAuthenticationInfo; } //用于授权 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // TODO Auto-generated method stub //从principals获取主身份信息 //将getPrimaryPrincipal方法返回值转为真实身份信息(在上边的doGetAuthecticationInfo认证通过填充到SimpleAuthenticationInfo) String userCode = (String)principals.getPrimaryPrincipal(); //根据信息获取权限信息 //连接数据库。。。 //模拟从数据库获取到数据 List permissions = new ArrayList(); permissions.add("user:create"); permissions.add("items:add"); //... //查询到权限数据,返回 SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo(); //将上边查询到授权信息填充到simpleAuthorizationInfo对象中 simpleAuthorizationInfo.addStringPermissions(permissions); return simpleAuthorizationInfo; } } 登录:

原理: 使用FormAuthenticationFilter过滤器实现,原理如下: 将用户没有认证时,请求loginUrl进行认证,用户身份和用户密码提交数据到loginurl,FormAuthenticationFilter拦截住取出request中的username和password(两个参数名称是可以配置的), FormAuthenticationFilter调用realm传入一个token(username和password),realm认证时根据username查询用户信息(在Activeuser中存储,包括……)如果查询不到,realm返回null,FormAuthenticationFilter 向request域中填充一个参数(记录了异常信息) /js/** = anon ……

controller代码 @RequestMapping("login") public String login(HttpServletRequest request)throws Exception{ //如果登录失败从request中获取认证异常信息,shiroLoginFailure就是shiro异常lei的全限定名 String shiroLoginFailure = request.getParameter("shiroLoginFailure"); //根据shiro返回的异常类路径判断,抛出指定异常信息 if (exceptionClassName!=null){ if(UnknownAccountException.class.getName().equals(exceptionClassName)) { //最终会抛给异常处理器 throw new CustomException("账号不存在"); }else if(IncorrectCredentialsException.class.getName().equals(exceptionClassName)) { throw new CustomException("用户名/密码错误"); }else { throw new Exception();//最终在异常处理器生成未知错误 } } //此方法不处理登录成功(认证成功),shiro认证成功会自动跳转到上一个路径 //登录失败还到login return "relogin"; } 登出

/logout = logout - 注意:由于FormAuthenticationFilter的用户身份和密码的input的默认值(username和password),修改页面的账号和密码的input的名称为username和password



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3