文档章节

jeesite添加自定义密码匹配方式以及加入AD域验证

LTX110168
 LTX110168
发布于 2017/05/19 16:21
字数 691
阅读 234
收藏 1

需求:根据配置文件配置,设置是否开启AD域验证。

 

第一步:修改jeesite.properties配置文件

ldap.url = ldap://ip地址:端口/
ldap.org = ou=XXXXXXXX,dc=XXXXX,dc=com
ldap.user = username
ldap.password = password
ldap.ldapfactory = com.sun.jndi.ldap.LdapCtxFactory
ldap.authentication = simple
#AD域登录验证是否开启,true:开启;false:关闭
ldap.adopen = true

 

第二步:自定义shiro密码验证方法。

1.     修改spring-context-shiro.xml

<!-- 定义Shiro安全管理配置 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
   <!--<property name="realm" ref="systemAuthorizingRealm" />-->//注释掉
   <property name="realm" ref="userRealm" />//自己定义
   <property name="sessionManager" ref="sessionManager" />
   <property name="cacheManager" ref="shiroCacheManager" />
</bean>

<!-- 3.1 直接配置继承了org.apache.shiro.realm.AuthorizingRealm的bean -->
<bean id="userRealm" class="com.test.modules.sys.security.SystemAuthorizingRealm">
   <!-- 配置密码匹配器 -->
   <property name="credentialsMatcher" ref="credentialsMatcher"/>
</bean>

<!-- 凭证匹配器 -->
<bean id="credentialsMatcher" class="com.test.modules.sys.security.CustomCredentialsMatcher">
</bean>

 

 

2.     新增自定义密码匹配类

public class CustomCredentialsMatcher extends SimpleCredentialsMatcher {
    @Override
    public boolean doCredentialsMatch(AuthenticationToken authcToken, AuthenticationInfo info) {
        return true;
    }
}

 

3.     修改SystemAuthorizingRealm.java文件initCredentialsMatcher方法

这个类在项目启动时自动注入,这个方法在注入时自动调用,根据配置文件选择加载匹配器。

/**

    * 设定密码校验的Hash算法与迭代次数

    */

   @PostConstruct

   public void initCredentialsMatcher() {

    //根据配置文件,在项目加载时加载密码匹配方式
      if("true".equals(openADFlag)){//openADFlag为配置文件中AD域是否开启标志

         setCredentialsMatcher(new CustomCredentialsMatcher());

      }else{

         HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(SystemService.HASH_ALGORITHM);

         matcher.setHashIterations(SystemService.HASH_INTERATIONS);

         setCredentialsMatcher(matcher);

      }

   }

第三步:修改SystemAuthorizingRealm.java中doGetAuthenticationInfo

该方法:认证回调函数, 登录时调用

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) {

   UsernamePasswordToken token = (UsernamePasswordToken) authcToken;

  

   // 校验登录验证码

   if (LoginController.isValidateCodeLogin(token.getUsername(), false, false)){

      Session session = UserUtils.getSession();

      String code = (String)session.getAttribute(ValidateCodeServlet.VALIDATE_CODE);

      if (token.getCaptcha() == null || !token.getCaptcha().toUpperCase().equals(code)){

         throw new AuthenticationException("msg:验证码错误, 请重试.");

      }

   }



   /*

      1.读取配置文件,是否进行AD域验证

      2.如果否,则继续往下走,使用原来的流程

      3.如果是,获取到用户后就不需要进行密码验证了。

   */



   if("true".equals(openADFlag)){

      openAD(token.getUsername(),String.valueOf(token.getPassword()));

   }

   // 校验用户名密码

   User user = getSystemService().getUserByLoginName(token.getUsername());

   if (user != null) {

      if (Global.NO.equals(user.getLoginFlag())){

         throw new AuthenticationException("msg:该已帐号禁止登录.");

      }

      byte[] salt = Encodes.decodeHex(user.getPassword().substring(0,16));

      SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(new Principal(user, token.isMobileLogin()),

            user.getPassword().substring(16), ByteSource.Util.bytes(salt), getName());

      return info;

   } else {

       if("true".equals(openADFlag)){

               throw new AuthenticationException("msg:请联系系统管理员.");

           }

      return null;

   }

}

第四步:添加AD域验证方法

//判断是否需要AD域验证

 protected  Boolean openAD(String username, String password){



       DirContext ctx = null;

       AdConfig adf = AdConfig.getAdConfig();

       Hashtable env = new Hashtable();

       try {

          env.put(Context.PROVIDER_URL, adf.getUrl() + URLEncoder.encode(adf.getOrg(), "utf-8"));

       } catch (UnsupportedEncodingException e) {

          e.printStackTrace();

       }

       String org=adf.getOrg();

       String dc=org.replaceFirst(",dc=","@");

       dc=dc.substring(dc.indexOf("@"));

       dc=dc.replaceFirst(",dc=",".");



       env.put(Context.SECURITY_PRINCIPAL, username+dc);

       env.put(Context.SECURITY_CREDENTIALS,password);

       env.put(Context.INITIAL_CONTEXT_FACTORY,adf.getLdapfactory());

       env.put(Context.SECURITY_AUTHENTICATION, adf.getAuthentication());



       try {

          ctx = new InitialDirContext(env);// 初始化上下文

          System.out.println("身份验证成功!");

          return true;

       } catch (javax.naming.AuthenticationException e) {

          e.printStackTrace();

          throw new AuthenticationException("msg:AD域身份验证失败.");

       } catch (javax.naming.CommunicationException e) {

          e.printStackTrace();

          throw new AuthenticationException("msg:AD域连接失败!");

       } catch (Exception e) {

          e.printStackTrace();

          throw new AuthenticationException("msg:AD域身份验证未知异常!");

       } finally{

          if(null!=ctx){

             try {

                ctx.close();

                ctx=null;

             } catch (Exception e) {

                e.printStackTrace();

             }

          }

       }

 }
 
 

© 著作权归作者所有

LTX110168
粉丝 11
博文 67
码字总数 35547
作品 0
潍坊
私信 提问
JeeSite 4.0.0 开发平台社区测试版公布,欢迎大家测试反馈意见

JeeSite 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring MVC、Apache Shiro、MyBatis、Beetl、Bootstrap、AdminLTE),在线代码生成功能,包括核心模块如:组织...

ThinkGem
2018/02/25
13K
32
JeeSite环境搭建及运行和打包(master20161117)

涉及的软件: 1、phpStudy(主要用MySql) 2、maven3(用于依赖包,下面我将上传已经下载好所有依赖包的版本,保证运行正常) 具体操作: 0、前言 由于GitHub上的Release版本没有及时更新,所...

easonjim
2016/11/18
0
0
jeesite 快速开发平台 初体验

http://www.jeesite.com/ GitHub:https://github.com/thinkgem/jeesite 开源中国:http://git.oschina.net/thinkgem/jeesite 更多文档 https://github.com/thinkgem/jeesite/tree/master/do......

晨猫
2018/05/21
1K
0
jeesite代码生成界面的那个下拉选框里,不显示我创建的数据表,怎么弄

我使用jeesite项目里的代码生成,按照jeesite数据库规范创建数据表,然后在业务表模块里面进行代码生成,但是”业务表添加“页面的那个下拉框不显示任何表名,包括jeesite原本自带的和我自己...

齿轮1
04/01
155
0
ThinkGem/JeeSite4 Spring Cloud

引言 JeeSite Spring Cloud 是基于 Spring Cloud Finchley 的一个分布式系统套件的整合。 特点:用经典开发模式,开发分布式应用,两个字【简单】,一个字【快】。 技术选型 分布式系统主框架...

ThinkGem
2018/12/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
462
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
17
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
8
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
21
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部