当前位置: 首页 > news >正文

Shiro基于组织机构的登录验证

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

我们要加入组织机构进行登录,无非就是多传递一个参数给shiro,之后在自己的realm里面进行验证,所以问题的关键是要如何获取这个组织机构,查看一下shiro,发现shiro是通过FormAuthenticationFilter,UsernamePasswordToken来进行用户名密码的传递的,感兴趣的朋友可以详细读一下源码。

所以对这两个类进行扩展,代码如下:

FormAuthenticationFilter

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.apache.shiro.web.util.WebUtils;

public class MyFormAuthenticationFilter extends FormAuthenticationFilter{
 private String orgcodeParam="orgcode";
 public String getOrgcodeParam() {
         return orgcodeParam;
 }
 protected String getOrgcode(ServletRequest request) {
        return WebUtils.getCleanParam(request, getOrgcodeParam());
    }
 
 @Override
    protected AuthenticationToken createToken(ServletRequest request,
            ServletResponse response) {
        String username = getUsername(request);
        String password = getPassword(request);
        String orgcode = getOrgcode(request);
        boolean rememberMe = isRememberMe(request);
        String host = getHost(request);
        return new MyUsernamePasswordToken(username, password, rememberMe,
                host, orgcode);
    }
}

UsernamePasswordToken:

import org.apache.shiro.authc.UsernamePasswordToken;

public class MyUsernamePasswordToken extends UsernamePasswordToken{
 /**
  *
  */
 private static final long serialVersionUID = 1L;
 private String orgcode;
 public MyUsernamePasswordToken (){} 
 
 public MyUsernamePasswordToken (String username, String password,
            boolean rememberMe, String host, String orgcode) {
        super(username, password, rememberMe, host);
        this.orgcode = orgcode;
    }
 
 public String getOrgcode() {
  return orgcode;
 }

 public void setOrgcode(String orgcode) {
  this.orgcode = orgcode;
 }
}

ok写完这两个类,工作基本上就完成大部分了,接下来在登录页面加入组织机构的组件,name属性要和MyFormAuthenticationFilter类中的常量 private String orgcodeParam="orgcode";保持一致。

然后更改shiro配置文件中的过滤器,改成MyFormAuthenticationFilter,简单的做法就是在配置文件中搜索FormAuthenticationFilter然后替换成MyFormAuthenticationFilter即可。

最后改写MyRealm中的doGetAuthenticationInfo方法,“MyRealm”是我们实现登录以及授权认证的AuthorizingRealm的子类,代码如下,其实就是吧原来的UsernamePasswordToken改成MyUsernamePasswordToken

protected AuthenticationInfo doGetAuthenticationInfo( 
                AuthenticationToken authcToken ) throws AuthenticationException { 
     MyUsernamePasswordToken token = (MyUsernamePasswordToken) authcToken; 
        String userName = token.getUsername(); 
        String passWord = String.valueOf(token.getPassword());
        String orgCode = String.valueOf(token.getOrgcode());
        System.out.println("\n****************orgCode:"+orgCode+"************\n");
        System.out.println("\n****************userName:"+userName+"************\n");
        if( userName != null && !"".equals(userName) ){ 
         UserInfoExample example = new UserInfoExample();
         // md5加密
            try {
             passWord = new String(passWord);
                MessageDigest md = MessageDigest.getInstance("MD5");
                // md.digest() 该函数返回值为存放哈希值结果的byte数组
                passWord = byteToString(md.digest(passWord.getBytes()));
            } catch (NoSuchAlgorithmException ex) {
                ex.printStackTrace();
            } 
         example.createCriteria().andUsernameEqualTo(userName).andUserpassEqualTo(passWord);
           
         List<UserInfo> users = userInfoMapper.selectByExample(example);
           
            UserInfo user = null;
            if(users != null && users.size() > 0) {
             user = users.get(0);
            }
            if( user != null )  {
             //设置当前用户
             token.setPassword(passWord.toCharArray());
             SecurityUtils.getSubject().getSession().setAttribute("userId", user.getUserid());
             SecurityUtils.getSubject().getSession().setAttribute("userName", user.getUsername());
             return new SimpleAuthenticationInfo( 
                         user.getUsername(),user.getUserpass(), getName()); 
            }
             
        } 
        return null; 
    }

到此我们就完成了shiro基于组织机构的登录认证,运行程序看如下效果

095951_dLKF_2609444.png

095952_6U3a_2609444.png

转载于:https://my.oschina.net/u/2609444/blog/648313

相关文章:

  • maven部署构建到私服
  • Android 发送短信总结
  • 笔记 - 10.4、HTML - CSS滤镜笔记
  • Java BigDecimal详解
  • javap的使用
  • java面向对象中的方法重载与方法重写的区别
  • Hadoop2.7实战v1.0之Hive-2.0.0+MySQL本地模式安装
  • 封装常用的Javascript跨浏览器方法
  • 如何安装linux系统
  • linux系统优化脚本实现
  • php用GD库给图片添加水印
  • [性能]ulimit与systemtap
  • 问题1:javascript的函数对象问题
  • 进程大概枝杈【B篇】进程间通信
  • iOS开发中的错误整理,导航控制器的导航栏取消系统渲染的错误
  • [deviceone开发]-do_Webview的基本示例
  • ES6--对象的扩展
  • ES6之路之模块详解
  • FastReport在线报表设计器工作原理
  • k个最大的数及变种小结
  • Python爬虫--- 1.3 BS4库的解析器
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 基于web的全景—— Pannellum小试
  • 区块链将重新定义世界
  • 实现简单的正则表达式引擎
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • Linux权限管理(week1_day5)--技术流ken
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • #{}和${}的区别?
  • (10)ATF MMU转换表
  • (JS基础)String 类型
  • (Note)C++中的继承方式
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (转)程序员疫苗:代码注入
  • (转)大型网站架构演变和知识体系
  • **CI中自动类加载的用法总结
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .gitignore文件—git忽略文件
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET MVC第五章、模型绑定获取表单数据
  • .net生成的类,跨工程调用显示注释
  • .net中调用windows performance记录性能信息
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @SuppressWarnings注解
  • []sim300 GPRS数据收发程序
  • [1] 平面(Plane)图形的生成算法
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包
  • [FTP]pureftp部署和优化
  • [IE9] GPU硬件加速到底是实用创新还是噱头
  • [JavaScript]_[初级]_[关于forof或者for...of循环语句的用法]
  • [javaSE] GUI(事件监听机制)