package c.v.swms.server.service.security.pojo; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang.StringUtils; import c.v.swms.server.model.base.pass.PasswordRule; import c.v.swms.server.utils.DateUtil; import c.v.swms.server.web.filter.WarehouseHolder; import c.v.thorn.server.exception.BusinessException; import c.v.thorn.server.model.security.User; import c.v.thorn.server.service.security.pojo.DefaultUserManager; import c.v.thorn.server.util.LocalizedMessage; import c.v.thorn.server.web.security.UserHolder; public class DefaultSwmsUserManager extends DefaultUserManager { //密码策略返回消息 public String message; public void saveUser(User user, Locale locale) { if (this.retrieve(user.getLoginName()) != null && user.isNew()) { throw new BusinessException("user.already.exsits", new String[] { user.getLoginName() }); } PasswordRule rule = getPasswordRule(); User dbuser; if (user.isNew()) { dbuser = user; dbuser.setEnabled(true); dbuser.setLocked(false); } else { dbuser = load(User.class, user.getId()); } if (user.getFirstPage() != null && user.getFirstPage().getId() != null) { dbuser.setFirstPage(user.getFirstPage()); } else { dbuser.setFirstPage(null); } //密码规则校验 verifyPassByRule(dbuser, rule, user.getPassword()); dbuser.setPassword( DigestUtils.shaHex(user.getPassword())); dbuser.setStrExtend1(user.getStrExtend1()); dbuser.setStrExtend2(user.getStrExtend2()); dbuser.setStrExtend3(user.getStrExtend3()); dbuser.setStrExtend4(user.getStrExtend4()); dbuser.setLocale(locale); dbuser.setExpiryDate(user.getExpiryDate()); dbuser.setEmail(user.getEmail()); dbuser.setLoginName(user.getLoginName()); dbuser.setName(user.getName()); dbuser.setReferenceModel( user.getReferenceModel()==null?WarehouseHolder.getWarehouse(). getReferenceModel():user.getReferenceModel()); this.commonDao.store(dbuser); } /** * 用户修改密码 */ public void modifyPassword(String oldPassword, String newPassword, String confirmPassword) { User user = commonDao.load(User.class, UserHolder.getUser().getId()); PasswordRule rule = getPasswordRule(); //新密码一致性验证 if(!(newPassword.trim()).equals(confirmPassword.trim())){ throw new BusinessException("newPassword.notsame"); } //原密码验证 String oldPass = DigestUtils.shaHex(oldPassword); if (!oldPass.equals(user.getPassword())) { throw new BusinessException("password.notCorrect"); } verifyPassByRule(user, rule, newPassword); String newPass = DigestUtils.shaHex(newPassword); user.setPassword(newPass); commonDao.store(user); LocalizedMessage.addMessage("password.Change.success"); } private void verifyPassByRule(User user, PasswordRule rule, String newPassword) { if (rule == null) { return; } //新密码规则验证 if (this.isPass(rule, newPassword, user) == false) { throw new BusinessException(message); } //当不区分大小写时把修改的密码转换成小写的存到数据库 if(!rule.getCaseSensitive()){ newPassword = newPassword.toLowerCase(); } String newPass = DigestUtils.shaHex(newPassword); user.setPassword(newPass); //当密码重复周期为0时把用户的历史密码清空 if(rule.getRepeatCycle() == 0){ user.setStrExtend5(""); } else { //新密码重复性验证 if (!StringUtils.isEmpty(user.getStrExtend5()) && user.getStrExtend5().indexOf(newPass) >= 0) { throw new BusinessException("password.history.dupicate"); } //将新密码加入历史密码组, //如果历史密码超过重复周期,去掉前面的历史密码 user.setStrExtend5(user.getStrExtend5() + newPass + ","); int times = StringUtils.countMatches(user.getStrExtend5(), ","); while (times > rule.getRepeatCycle()) { user.setStrExtend5(StringUtils.substring(user.getStrExtend5(), user.getStrExtend5().indexOf(",")+1)); times = StringUtils.countMatches(user.getStrExtend5(), ","); } } //当策略的密码有效期为0时,则修改用户的有效期为null即永不过期 if(rule.getPeriod() == 0){ user.setPasswordExpiryDate(null); } else { user.setPasswordExpiryDate( DateUtil.addDayToDate(new Date(), rule.getPeriod())); } } @SuppressWarnings("unchecked") private PasswordRule getPasswordRule() { PasswordRule pass=null; List<PasswordRule> rules = commonDao.findByQuery( "from PasswordRule pr where pr.isDisable = false"); if (rules == null || rules.size() < 1) { return null; } pass = rules.get(0); return pass; } /** * 密码策略判断 * @param password * @param user * @return */ private boolean isPass(PasswordRule pass, String password, User user) { if (pass == null) { return true; } //长度不足 if (pass.getPwdLength() > password.length()) { message = "connot.length.shot"; return false; } //无特殊符号 if (pass.getNeedSymbol()) { Pattern p = Pattern.compile("(.*[^a-zA-z0-9].*)"); Matcher m = p.matcher(password); if (!m.matches()) { message = "connot.needSymbol"; return false; } } //无字母 if(pass.getNeedLetter()) { Pattern p = Pattern.compile("(.*[a-zA-z].*)"); Matcher m = p.matcher(password); if (!m.matches()) { message = "connot.needLetter"; return false; } } //无数字 if (pass.getNeedNumber()) { Pattern p = Pattern.compile("(.*[0-9].*)"); Matcher m = p.matcher(password); if (!m.matches()) { message = "connot.needNumber"; return false; } } return true; } private String shaEncodePassword(String painPwd) { painPwd = painPwd == null ? "" : painPwd; if (painPwd.length() == 40) { return painPwd; } return DigestUtils.shaHex(painPwd); } }
相关推荐
HP_UX 和 AIX 小型机密码策略整改方案 本文档介绍了 HP_UX 和 AIX 小型机密码策略整改方案,旨在确保用户访问的系统安全性。该方案涵盖了密码策略设置、密码安全加固、root 用户锁定解决办法等多个方面。 一、 ...
在 Linux 系统中,我们可以通过修改 `/etc/pam.d/system-auth` 文件来设置密码策略。在该文件中,我们可以添加以下内容: `password requisite pam_cracklib.so difok=3 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1...
WINDOWS密码策略修改-目前真正直接有效的!
本教程将深入探讨如何利用OpenLDAP来管理Linux用户和组,以及实施密码策略。 首先,我们需要理解OpenLDAP的基础概念。OpenLDAP是一个开源实现的LDAP协议服务器,它提供了一个中央存储库,用于存储网络中的用户账户...
### 如何设置PAM模块控制Linux密码策略 在Linux系统中,为了确保用户账户的安全性,通常会采用一系列措施来加强密码策略。其中,PAM(Pluggable Authentication Modules)模块是一个非常重要的组件,它提供了灵活的...
码对于服务器的安全是个很重要的部分,设置安全的密码策略和符合复杂度的密码是服务器安全保障的重要组成部分。在Windows Server 2003 系统的“帐户和本地策略” 中包括“帐户策略”和“本地策略”两个方面,而其中...
Oracle 数据库加固之密码策略 Oracle 数据库加固之密码策略是指对 Oracle 数据库进行安全加固,以防止未经授权的访问和操作。密码策略是数据库安全的重要组成部分,包括密码长度、复杂度检测、最大最小使用时间、...
### Windows Server 2008 在域中不能更改密码策略详解 #### 一、问题背景与概述 在Windows Server 2008环境下,当计算机加入域后,往往会遇到一个常见问题:即无法直接通过“本地策略编辑器”更改密码策略。这是...
Windows Server 2008 密码策略 —— 新版服务器操作系统解决了早先的密码策略限制 Windows Server 2008 密码策略是新版服务器操作系统中的一项重要安全机制,解决了早先的密码策略限制。在之前的 Windows Server ...
omniauth-identity, OmniAuth的简单登录和密码策略 OmniAuth身份身份验证服务提供了应用程序使用传统登录/密码认证系统的方法,而不需要放弃OmniAuth提供的简单认证流程。 为了尽可能不引人注意而设计的身份: 它为...
服务器平台密码策略管理 服务器平台密码策略管理是指对Windows和Linux服务器平台进行密码策略管理,以确保服务器的安全和可靠性。本文将对Windows和Linux服务器平台的密码策略管理进行详细的介绍。 一、Windows...
Windows密码安全配置;;1.密码必须符合复杂性要求:启用 2.密码长度最小值:14个...进入“密码策略”设置窗口;6、配置密码策略 ;在设置完组策略后,打开开始菜单,在下列的搜索框中输入gpupdate并运行。 ;8、查看结果
Windows 2008 域控制器下修改密码策略分析 本文档主要介绍了在 Windows 2008 域控制器下修改密码策略的步骤,以及在忘记密码的情况下如何恢复系统登陆权限。 一、修改密码策略 在 Windows 2008 域控制器下,如果...
密码策略是确保网络安全的关键因素之一,它规定了用户密码的复杂性、有效期、重置规则等。下面将详细阐述如何在Windows 2008域控制器下修改密码策略,并探讨相关知识点。 1. **密码策略概述**: - 密码策略是一组...
4. **账号策略**:这部分策略涉及到用户的密码策略,如最小密码长度、密码复杂度要求、密码最长使用期限等。通过Python脚本,可以自动化地调整这些策略,适应不同的安全需求。 5. **审核策略**:审核策略定义了哪些...
第三章 入侵检测技术实验 密码策略审计 【实验名称】 密码策略审计 【实验目的】 使用 RG-IDS 对网络服务的登录密码强度进行审计 【背景描述】 某企业网络中使用 FTP 服务器提供文件传输服务。用户在访问 FTP 服务器...
WIDNOWS LIUNX 密码策略配置
"Linux系统密码策略设置" Linux系统密码策略设置是为了提高系统安全性和保护用户账户安全的一种机制。该机制通过PAM(Pluggable Authentication Modules)认证机制来实现密码策略的设置。 PAM是由Sun提出的一种...
NULL 博文链接:https://zhaoshijie.iteye.com/blog/839806