`
kang
  • 浏览: 474434 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

アカウントロック機能の調査

    博客分类:
  • NBS
阅读更多

 

这两天在调查“ 输错 n 次后 账户” 的功 ,日方客户想这样实现。

 

我先看文档,没找到相关内容。转变思路,在 IM 画面中查找,找到了很类似的功能,具体 情况是: IM 画面中提供的是 这样 的功能:用 户输错 的次数,会被自 动递 记录 帐户 管理 面(注意:假 设该 后来又正确登 了一下, 前面的 错误 次数会被清零),管理 可以据此决定是否 帐户

 

只要管理 员锁 定了某 帐户 即使以正确的用 / 码尝试 ,也无法 入, 面提示: 该帐户 已被 定,需要 系管理 员进 行解

 

但是,这个调查结果并不完全符合用户的需求,客户想要实现的是设置个数字,当最终用户输入密码错误次数达到这个数字时,就自动锁定该帐户,而不是让客户这个管理员自己去一个个地看,不是人为去锁定(解锁要求是人为解锁)。

 

 

没办法,还要继续。

 

今天上午一过来,尝试从新的思路入手。

 

调查用户登录时的处理逻辑,最终在开发环境的实例项目的 web.xml 文件中找到我想要的配置项:

    <servlet-mapping>

        <servlet-name>UserCertificationServlet</servlet-name>

         <url-pattern>/user.login</url-pattern>

    </servlet-mapping> 
 

根据这个找到对应的 Servlet

    <servlet>

        <servlet-name>UserCertificationServlet</servlet-name>

     <servlet-class>jp.co.intra_mart.foundation.security.servlet.UserCertificationServlet</servlet-class>

    </servlet> 

 

这个 servlet 是位于 IM jar 包中的,反编译,看源代码。

 

想到新的思路,修改此处配置:

    <servlet>

        <servlet-name>UserCertificationServlet</servlet-name>

                                <servlet-class>employee.password.UserCertificationServlet</servlet-class>

    </servlet> 
 

让用户登录时的处理逻辑不再指向原先 jar 包中的 servlet ,而是指向我的 servlet

 

我将原先的 UserCertificationServlet 拷贝过来,设置断点,不断地跑页面登录,将这段逻辑大概搞清楚后,然后加上自己的处理逻辑,主要就是用户登录错误此时达到或者超过设置的数字时,则将该用户锁定,需要管理员解锁。

 

经过 N 次尝试,经过 N-1 次失败,最终将其搞定了。

 

我追加的主要一段逻辑代码如下:

if  ( "user" .equals(loginInfo.getLoginType())) {

 

       AccountManager accountManager = new AccountManager(loginInfo.getLoginGroup());

       Account account = accountManager.getAccount(loginInfo.getUser());

                          

       String strLockCount = PropertiesUtil.getMessage ( "lockCount" );

       int intLockCount = 0;

       if (strLockCount != null && ! "" .equals(strLockCount.trim())) {

                     intLockCount = Integer.parseInt (strLockCount);

       }

 

                           // このユーザのログイン失敗回数 >=ロック設定回数

            if (account != null && account.getLoginFailureCount() >= intLockCount) {

 

                                  // 日付を設定した場合、アカウントはロックされる。

                                  account.setLockDate(new Date());

                                  // アカウントを更新します。

                                  accountManager.updateAccount(account);

                                  // ロックフラッグ

                                  loginCertification = -3;

              }

       } 

 

分析: debug 发现,源代码中, loginCertification 3时表示登录成功,为 0时表示登录失败,为 -3时表示帐户已被锁定。

 

引入的两个包主要是:

import  jp.co.intra_mart.foundation.security.account.Account;

import jp.co.intra_mart.foundation.security.account.AccountManager; 
   

其中,关键的两点就是:

account.setLockDate(new Date()); accountManager.updateAccount(account);

前者主要是利用现在的时间作为参数传进去将帐户 account 锁定(意思就是立即锁定该帐户);

后者主要是将对该帐户的锁定信息更新一下(特别注意后面这一点,只有 update 后才会在 group 管理界面上真正自动将该用户锁定)。

 

我将以前写过的配置文件处理类拷贝过来,这样,最终实现了客户的需求:在 properties属性文件中进行设置,当最终用户登录次数达到或者超过这个数字时,就会自动将这个帐户锁定,需要管理员进行解锁操作。

 

但是,我自己也小结了下: 可能也可以使用 Listeren 来实现,但是昨天下午也大概看过这方面的 API ,没看到什么对应的方法,也没什么思路。

 

感觉现在的这种实现还是有点隐患的: 原先用 group )都是交 jp.co.intra_mart.foundation.security.servlet.UserCertificationServlet 的, 实现对 户帐户进 定, 修改了 web.xml 中配置 UserCertificationServlet 的指向 Servlet 文件。

尽管个人已 经进 行了多次 测试 ,但 是有点担心

 

 

 

20090123追加:

 

部门首席技术专家改进本例,使用了Filter,学习一下。

 

总体概述:

 

写了一个过滤器来达到指定类型的用户在登录失败次数到达指定数值时,锁定该用户。

/user.login 这个页面是由Servlet:UserCertificationServlet? (jp.co.intra_mart.foundation.security.servlet.UserCertificationServlet? ) 处理的,给它加一个Filter,使得在servlet执行完成后追加执行失败次数检查,一旦满足条件(用户类型满足设定的类型,该用户当前尚未被锁定 且,该用户的登录失败次数超过指定的最大次数)就将该用户的锁定日期设置为当前日期。用户即被锁定,该用户再尝试登录将得到错误提示:

指定されたアカウントはロックされているためログインできませんでした。
しばらくたってから再ログインして下さい。

 

web.xml中的对应配置:

    <!-- アカウントロック -->
    <filter>
        <filter-name>LoginFailureCountCheckFilter</filter-name>
        <filter-class>**.**.LoginFailureCountCheckFilter</filter-class>
        <init-param>
            <description>The login type of the user that to check.</description>
            <param-name>loginType</param-name>
            <param-value>user</param-value>
        </init-param>
        <init-param>
            <description>The maximum allowable login failure count.</description>
            <param-name>maxFailureCount</param-name>
            <param-value>2</param-value>
        </init-param>
    </filter>
    
    
    
   <!-- アカウントロック -->
    <filter-mapping>
        <filter-name>LoginFailureCountCheckFilter</filter-name>
        <servlet-name>UserCertificationServlet</servlet-name>
    </filter-mapping>
	
	
	<servlet>
        <servlet-name>UserCertificationServlet</servlet-name>
        <servlet-class>jp.co.intra_mart.foundation.security.servlet.UserCertificationServlet</servlet-class>
    </servlet>
	
	
	<servlet-mapping>
        <servlet-name>UserCertificationServlet</servlet-name>
        <url-pattern>/user.login</url-pattern>
    </servlet-mapping>
 

 

Filter处理类LoginFailureCountCheckFilter.java

/**
 * 
 */
package ***.***.web.filter;

import java.io.IOException;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import jp.co.intra_mart.common.platform.log.Logger;
import jp.co.intra_mart.foundation.security.account.Account;
import jp.co.intra_mart.foundation.security.account.AccountManager;
import jp.co.intra_mart.foundation.security.certification.LoginRequestInfo;
import jp.co.intra_mart.foundation.security.exception.AccessSecurityException;
import jp.co.intra_mart.system.security.LoginInfoSerializer;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;

/**
 * アカウントロック。
 * 
 * @author **, **
 */
public class LoginFailureCountCheckFilter implements Filter {
    private static final Logger LOG = Logger.getLogger(LoginFailureCountCheckFilter.class);
    private static final boolean DEBUG = LOG.isDebugEnabled();

    /**
     * The login type of the user that to check.
     */
    private String loginType;

    /**
     * The maximum allowable login failure count.
     */
    private int maxFailureCount;

    /**
     * {@inheritDoc}
     */
    public void init(FilterConfig config) throws ServletException {
        this.maxFailureCount = NumberUtils.toInt(config.getInitParameter("maxFailureCount"));
        this.loginType = StringUtils.trim(config.getInitParameter("loginType"));
    }

    /**
     * {@inheritDoc}
     */
    public void destroy() {
    }

    /**
     * {@inheritDoc}
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException,
            IOException {
        // Execute the servlet "jp.co.intra_mart.foundation.security.servlet.UserCertificationServlet" first,
        // as it increase the failure count while login failure.
        chain.doFilter(request, response);

        // Check failure count.
        doCheck(request, response);
    }

    /**
     * Do check failure count.
     * 
     * @param request
     *            the servlet request
     * @param response
     *            the servlet response
     */
    private void doCheck(ServletRequest request, ServletResponse response) {
        String imLoginInfo = request.getParameter("im_login_info");
        String username = request.getParameter("im_user");

        LoginRequestInfo loginInfo = LoginInfoSerializer.load(imLoginInfo);

        try {
            checkFailureCount(loginInfo, username);
        } catch (AccessSecurityException e) {
            LOG.error(e.getMessage(), e);
        }
    }

    /**
     * Check the failure count of <code>loginInfo</code>, if it max than
     * {@link #maxFailureCount}, lock the user.
     * 
     * @param loginInfo
     *            the login info
     * @param username
     *            the username
     * @throws AccessSecurityException
     *             if access the account manager failed
     */
    private void checkFailureCount(LoginRequestInfo loginInfo, String username) throws AccessSecurityException {
        if (StringUtils.equals(this.loginType, loginInfo.getLoginType())) {
            AccountManager accountManager = new AccountManager(loginInfo.getLoginGroup());
            Account account = accountManager.getAccount(username);

            if (DEBUG) {
                LOG.debug("The login failure count of user {} is {}.", account.getUserId(), account
                        .getLoginFailureCount());
            }
            // このユーザのログイン失敗回数>=ロック設定回数
            if (account != null && !account.isLock() && account.getLoginFailureCount() > this.maxFailureCount) {
                if (DEBUG) {
                    LOG.debug("Locking user {}as the login failure count {} is greater than the max failure count {}.",
                            account.getUserId(), account.getLoginFailureCount(), this.maxFailureCount);
                }
                // 日付を設定した場合、アカウントはロックされる。
                account.setLockDate(new Date());
                // アカウントを更新します。
                accountManager.updateAccount(account);
            }
        }
    }

}
 

 

 

 

分享到:
评论
1 楼 戴锋伟 2010-07-27  
搂住的这篇文章很好。

我这儿有点关于intra-mart的问题想请教搂住,希望搂住能够解答。

我刚开始学intra-mart,手头上资料不是很全。仅有的一些资料也是从nttdata哪儿下载来的。环境已经搭好了,服务器也可以跑起来了。按照文档,下面两个URL可以登陆并可以操作了。通过画面操作,我也已经把初始数据导进来了。
http://localhost:8084/imart/system.admin
http://localhost:8084/imart/dev.manager


现在的问题是,不知道以怎样的入口访问sample应用程序。
一般的web应用程序多是通过URL访问,intra-mart也不例外。
但我不知道user.login后面加什么参数可以初始登陆画面。
http://localhost:8084/imart/user.login?xxx=aaa&yyy=bbb

相关推荐

    问卷:PHPリジナルアプリログイン机能のついたアンケートアプリ〜PHPとMySQLの基础を使ってVer.2〜

    ログイン/ログアウト 前回作成したメモアプリから一歩进んで,アンケートアプリを作成することにしました。 入力时のバリデーション,最低限のセキュリティに关して以下の様な多くの学びがありました。 登录时の重复...

    sftools

    にーboードのみでアカウントを选択し,组织にログインできる。 ショートカットキー Alt + S:sftoolsを开く(拡张机能&gt;キーboードショートカットから変更可) 上下キー:アカウントを选択 左右キー:开くページを选...

    RottenPoteto:这是一个Laravel Web应用程序

    ロッテンポテト アプリケーショの概要 はのアプリケーションショ映画のレビューサイトです。 アプリケーションの机能 ではのアプリケーションションが管理者が最近见た映画を绍介し,ザユーザーがそのがそ映画に关す...

    coderdojo.jp:由Ruby on Rails开发的:yin_yang:CoderDojo Japan(@ coderdojo-japan)官方网站。 :gem_stone:

    )必要なもの:ブラウザ+ GitHubアカウントの执笔・编集( )必要なもの:ブラウザ+ coderdojo.jpアカウント新机能の开発やデザインの改善( )必要なもの:各种开発环境のセットアップ(开発者向け)新机能の开発や...

    ac-unit-test:AtCoderの问题ページから,ユニットテストを生成するFirefox Google Chromeアドオン

    AtCoderの问题ページから,ユニットテストを生成するFirefox / Google Chromeアドオンです。 ダウンロード Firefox版本: Google Chrome版: 対応言语 Java(JUnit) Kotlin(JUnit) C#(MS测试) Python3...

    original_calendar

    管理のアプリではスケジュール管理のカレンダーアプリです。 実装机能 ユーザー管理机能(gem:devise) カレンダー表示・イベント作成机能(gem:simple-calendar) 天気予报机能(API:OpenWeatherMap) タスク...

    我的田野笔记

    アカウント情报基本认证ユーザーID:keroドスワード:0520投稿用アカウントルールアドレス:test1 @ comドスワード:test1123阅覧用アカウントルールアドレス:test2 @ comドスワード:test2123机能①记事投稿画面・...

    paint-frontend-old-master.zip

    フきアプリ(フロント部) ブラウザ上で描いた絵をそのまま投稿できる。 アルバム管理ができ,スライドショーで阅覧できる。 敷居の高い他サイトに対して,ちょっとした絵を书きたい时に使うアプリ。 。アプリ外から...

    search-search-tweet-29629

    29629テスト用アカウントid: 密码:ddddddd2利用方法ログイン→记事投稿→タイトル/タグ/本文记入→下书きから记事投稿に変更→投稿トップページの记事本をクリック→记事本详细クリック→goodをクリック→しおりク...

    威夫兹

    アプリ概要このアプリでできることはゲストログイン机能质问投稿机能质问お気に入り机能(质问に対する)コメント投稿机能美容スケジュール管理机能パパ管理机能パパ活スケジュール管理机能GoogleMapAPIを用いた,...

    omotomasaya.github.io

    ポートフォリオtwitterのクローンアプリです。 デモ机能概要・ログイン,新规登录・...今后追加したいこと・いいね机能・フォロー机能・リツイート机能・検索机能(ハッシュタグ,アカウント)・コメント机能・退会机能

    english-wordbook__JavaScript:英単语学习Webアプリ(フロントエンド:JavaScript)

    英単语学习アプリ(フロントエンド:JavaScript) 英単语学习用のWebアプリです。学习はもちろん,ブックマーク机能や,新しく単语の登录も可能。自分だけの英単语帐を作れます。ダッシュboード画面より,习得率や...

    english-wordbook__React:英単语学习Webアプリ(フロントエンド:React)

    英単语学习アプリ(フロントエンド:React) 英単语学习用のWebアプリです。学习はもちろん,ブックマーク机能や,新しく単语の登录も可能。自分だけの英単语帐を作れます。ダッシュboード画面より,习得率や学习进...

    本地饮食

    ゲスト用アカウント ゲッダーの「ゲストユーザーでログイン」を选択して下さい。 (ゲストユーザーの编集・削除は出来ません) 利用方法 饮食店を追加する!→店铺情报入力・登录→店铺详细画面にていいねする ジ入...

    tanp_mission:TechTrainのMISSON TANP

    ログイページにゲストアカウントでログインできるboタンタ装しておりますので,そちらからログインして阅覧してください。 使用した技术 HTML5 CSS3 SCSS JavaScript Vue.js 引导程序 PHP7.x Laravel6.x ...

    RNHBFav:HBFavのReactNative版本

    ブックマークコメントにフォロワーのコメントまとめが无い クリップBOードのURLからブックマークする机能が无い 公开情报のみ扱う オリジナルの机能は下记です。 URLを入力してブックマークする机能 表记や色味や...

    how_to_access_local_pc_server_from_android_device:Androidの端末からPCのローカルサーバにアクセスする方法

    Androidの端末からPCのローカルサーバにアクセスする方法 Android実机からローカルのAPIサーバに接続したい时がある。そういった场合は,PC侧のChrome机能を使うことでカンタンに接続することができる。 実行环境 ...

    live_search

    ユーザー管理机能(devise,Active Hash)ログイン・ログアウト机能 イベント投稿机能画像投稿(Active Storage,S3) イベント覧ッ覧机能新着イベントト覧人気イベント一覧として,いいね数の多い投稿が表示される...

    UtakoSite:UtakoTUNE前端系统

    以下のアカウントのいずれかまでお気軽にご连络ください Twitter( ) ( ) github( ) UtakoSite(UtakoTUNE前端系统) “ UTAKO TUNE”的前端:VOCALOID歌曲搜索支持系统 特征 嵌入式Niconico播放器 从发布...

    homework_app

    宿题アプリケーション1概要ユーザー登录问题一覧表示机能问题解答机能答え合わせ成绩保存成绩表示演示ユーザー登录问题一覧表示机能问题解答机能答え合わせ成绩表示2本番环境デプロイ先テストアカウントアドレスパ...

Global site tag (gtag.js) - Google Analytics