- 浏览: 474434 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
jyjava:
呵呵,不错,跟把结果放到哈市map中一样,在查询数据库之前,先 ...
if (log.isDebugEnabled()) {}使用场景初析 -
eileennaly:
你好 我最近在研究S2dao(工作需要)但是因为菜鸟一枚(刚刚 ...
S2Dao的执行 -
nswish:
谢谢,受教了!
单例模式中的饿汉式和懒汉式 -
shangweiqiang24:
正要用到,捡到宝啦! 谢谢啊。
Seasar和S2Dao简介 -
hugh1st:
模糊测试主要适合哪些软件/项目的测试呢?看《测试之美》的时候了 ...
模糊测试(Fuzzing Test)个人小结
这两天在调查“ 输错 密 码 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); } } } }
评论
我这儿有点关于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
发表评论
-
Linux下Trac安装手记
2009-07-29 10:59 2095Linux下Trac安装手记 版权声明 :可以 ... -
Trac+subversion拥有强大的bug管理能力(介绍和Windows下安装)
2009-07-29 10:53 2480Trac+subversion拥有强大 ... -
读取properties属性文件中的配置信息
2009-03-19 17:55 1719示例代码: // 将指定路径下的资源文件中的 ... -
SQLServerException: Invalid object name '***_VIEW_
2009-03-19 13:52 3311现象:本地测试(拉了最新代码),选择类别的时候,页 ... -
“妖怪”问题也是有原因的
2009-03-17 16:48 1007今天,bug对应过程中 ... -
如何处理日文系统中的NEC拡張字
2009-03-16 17:04 1865http://blog.csdn.net/luyang101 ... -
通知メールで文字化け
2009-03-16 16:46 1664邮件乱码问题 通知メールで ... -
搜索条件 关键字
2009-03-16 16:44 1274如果条件入力部分支持多个入力关键字的,也就是以空格分隔关键字的 ... -
读取XSL文件指定节点(Subject)的值
2009-03-16 11:40 3649调用方: //以URL形式获取到连接到邮件文本xsl文件 ... -
NBS编码小结2
2009-03-11 20:56 1916SQL 语句错误: Caused by: ... -
NBS编码小结1
2009-03-11 19:50 1277千万注意:对象非空的判断一定要时时刻刻注意!否则极有可能 ... -
BVT应该测些什么?
2009-03-06 19:36 1960BVT应该测些什么? ... -
截图啊截图
2009-02-24 23:22 1075UT 测试时,发现 bug ,在 Track ... -
虚拟机重启后,使用域帐户却进不去了。
2009-02-23 21:25 2133虚拟机重启后,使用域帐户却进不去了。 尝试: ... -
临时map、正式map、数据库
2009-02-17 20:00 1304临时 map 、正式 map 、数据库 主 ... -
将int类型转换成String类型、List的使用和Eclipse插件implementors
2009-02-13 21:13 3563将 int 类型转换成 String 类型: ... -
SVN的getLock问题和数据库表中“日時”字段的长度问题
2009-02-12 17:47 1677SVN 的 getLock 问题:想修改 doc ... -
工具check Style和Find Bugs生成的report、Code两点
2009-02-11 18:55 1003工具 check Style 和 Find Bug ... -
SVN使用小记
2009-02-10 18:36 4428SVN 使用小记 问题 1 : S ... -
IMのバッチ機能でメール送信バッチ 15分間一回実行
2009-01-19 16:09 1254日方客 户 想实现一种功能:每 15 分钟,运行一次 ...
相关推荐
ログイン/ログアウト 前回作成したメモアプリから一歩进んで,アンケートアプリを作成することにしました。 入力时のバリデーション,最低限のセキュリティに关して以下の様な多くの学びがありました。 登录时の重复...
にーboードのみでアカウントを选択し,组织にログインできる。 ショートカットキー Alt + S:sftoolsを开く(拡张机能>キーboードショートカットから変更可) 上下キー:アカウントを选択 左右キー:开くページを选...
ロッテンポテト アプリケーショの概要 はのアプリケーションショ映画のレビューサイトです。 アプリケーションの机能 ではのアプリケーションションが管理者が最近见た映画を绍介し,ザユーザーがそのがそ映画に关す...
)必要なもの:ブラウザ+ GitHubアカウントの执笔・编集( )必要なもの:ブラウザ+ coderdojo.jpアカウント新机能の开発やデザインの改善( )必要なもの:各种开発环境のセットアップ(开発者向け)新机能の开発や...
AtCoderの问题ページから,ユニットテストを生成するFirefox / Google Chromeアドオンです。 ダウンロード Firefox版本: Google Chrome版: 対応言语 Java(JUnit) Kotlin(JUnit) C#(MS测试) Python3...
管理のアプリではスケジュール管理のカレンダーアプリです。 実装机能 ユーザー管理机能(gem:devise) カレンダー表示・イベント作成机能(gem:simple-calendar) 天気予报机能(API:OpenWeatherMap) タスク...
アカウント情报基本认证ユーザーID:keroドスワード:0520投稿用アカウントルールアドレス:test1 @ comドスワード:test1123阅覧用アカウントルールアドレス:test2 @ comドスワード:test2123机能①记事投稿画面・...
フきアプリ(フロント部) ブラウザ上で描いた絵をそのまま投稿できる。 アルバム管理ができ,スライドショーで阅覧できる。 敷居の高い他サイトに対して,ちょっとした絵を书きたい时に使うアプリ。 。アプリ外から...
29629テスト用アカウントid: 密码:ddddddd2利用方法ログイン→记事投稿→タイトル/タグ/本文记入→下书きから记事投稿に変更→投稿トップページの记事本をクリック→记事本详细クリック→goodをクリック→しおりク...
アプリ概要このアプリでできることはゲストログイン机能质问投稿机能质问お気に入り机能(质问に対する)コメント投稿机能美容スケジュール管理机能パパ管理机能パパ活スケジュール管理机能GoogleMapAPIを用いた,...
ポートフォリオtwitterのクローンアプリです。 デモ机能概要・ログイン,新规登录・...今后追加したいこと・いいね机能・フォロー机能・リツイート机能・検索机能(ハッシュタグ,アカウント)・コメント机能・退会机能
英単语学习アプリ(フロントエンド:JavaScript) 英単语学习用のWebアプリです。学习はもちろん,ブックマーク机能や,新しく単语の登录も可能。自分だけの英単语帐を作れます。ダッシュboード画面より,习得率や...
英単语学习アプリ(フロントエンド:React) 英単语学习用のWebアプリです。学习はもちろん,ブックマーク机能や,新しく単语の登录も可能。自分だけの英単语帐を作れます。ダッシュboード画面より,习得率や学习进...
ゲスト用アカウント ゲッダーの「ゲストユーザーでログイン」を选択して下さい。 (ゲストユーザーの编集・削除は出来ません) 利用方法 饮食店を追加する!→店铺情报入力・登录→店铺详细画面にていいねする ジ入...
ログイページにゲストアカウントでログインできるboタンタ装しておりますので,そちらからログインして阅覧してください。 使用した技术 HTML5 CSS3 SCSS JavaScript Vue.js 引导程序 PHP7.x Laravel6.x ...
ブックマークコメントにフォロワーのコメントまとめが无い クリップBOードのURLからブックマークする机能が无い 公开情报のみ扱う オリジナルの机能は下记です。 URLを入力してブックマークする机能 表记や色味や...
Androidの端末からPCのローカルサーバにアクセスする方法 Android実机からローカルのAPIサーバに接続したい时がある。そういった场合は,PC侧のChrome机能を使うことでカンタンに接続することができる。 実行环境 ...
ユーザー管理机能(devise,Active Hash)ログイン・ログアウト机能 イベント投稿机能画像投稿(Active Storage,S3) イベント覧ッ覧机能新着イベントト覧人気イベント一覧として,いいね数の多い投稿が表示される...
以下のアカウントのいずれかまでお気軽にご连络ください Twitter( ) ( ) github( ) UtakoSite(UtakoTUNE前端系统) “ UTAKO TUNE”的前端:VOCALOID歌曲搜索支持系统 特征 嵌入式Niconico播放器 从发布...
宿题アプリケーション1概要ユーザー登录问题一覧表示机能问题解答机能答え合わせ成绩保存成绩表示演示ユーザー登录问题一覧表示机能问题解答机能答え合わせ成绩表示2本番环境デプロイ先テストアカウントアドレスパ...