zoukankan      html  css  js  c++  java
  • 密码策略设置密码过期天数

    需要为程序中添加此功能。系统管理可以管理设置此参数,Default值为0,更新大于0,说明启用功能。其实它和用户管理表中的另外一个选项“密码永不过期”相辅相成之后,才能成形一个完整的功能。

    管理员更新“密码过期天数”选项值,如果由大于0的数值更新为0(初始值),数据库触发器会检查用户管理表中的“密码永不过期”选项或“密码过期日期”是否有值,如果条件为真,更新动作终止。

    tri_PasswordParameter_Update
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    ALTER TRIGGER [dbo].[tri_PasswordParameter_Update] ON [dbo].[PasswordParameter]
    FOR UPDATE
    AS
    BEGIN
        DECLARE @PasswordParameterId TINYINT,@ParameterValue TINYINT
        
        SELECT @PasswordParameterId = [PasswordParameterId] FROM DELETED
        SELECT @ParameterValue = [ParameterValue] FROM INSERTED
        
        IF (@PasswordParameterId = 5 AND @ParameterValue = 0 AND EXISTS(SELECT TOP 1 1 FROM [dbo].[Users] WHERE [PasswordNeverExpires] = 1 OR [PasswordExpirationDate] IS NOT NULL))
        BEGIN
            RAISERROR(N'设置已经生效应用,不能初始化为0。',16,1)
            ROLLBACK TRANSACTION
        END
    END

    用户管理表的“密码过期日期”,是只读字段,不能人为手动更新,方法可以参考:http://www.cnblogs.com/insus/archive/2012/02/08/2342430.html

    管理员更新“密码永不过期”选项,如果Enable的话,系统首选去检查密码参数设置的“密码过期天数”是否设值启用。如果没有启用,提示管理员首先设置。如果已经设置,系统会获取此值,并更新“密码过期日期”。如果取消,系统也会更新“密码过期日期”字段,初始化为NULL空。

    可以参考下面的触发器:

    tri_Users_Update
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO


    ALTER TRIGGER [dbo].[tri_Users_Update] 
    ON [dbo].[Users]
    FOR UPDATE
    AS
    DECLARE @PasswordExpiration TINYINT = [dbo].[udf_GetPasswordParameterValue](5)
    DECLARE @PasswordNeverExpires_N BIT = (SELECT [PasswordNeverExpires] FROM INSERTED)
    DECLARE @PasswordNeverExpires_O BIT = (SELECT [PasswordNeverExpires] FROM DELETED)
    DECLARE @UsersId INT = (SELECT [UsersId] FROM DELETED)

    IF @PasswordNeverExpires_N = 1 AND @PasswordExpiration = 0
    BEGIN
        RAISERROR(N'更新密码永不过期选项,先设置密码参数中的密码过期天数,更新操作终止。',16,1)
        ROLLBACK TRANSACTION
    END
    ELSE
    BEGIN
        IF  @PasswordNeverExpires_O = 0 AND @PasswordNeverExpires_N = 1 
            UPDATE [dbo].[Users] SET [PasswordExpirationDate] = DATEADD(day,@PasswordExpiration,CURRENT_TIMESTAMPWHERE [UsersId] = @UsersId
        
        IF @PasswordNeverExpires_O = 1 AND @PasswordNeverExpires_N = 0 
            UPDATE [dbo].[Users] SET [PasswordExpirationDate]  = NULL WHERE [UsersId] = @UsersId
            
        IF UPDATE([PasswordExpirationDate])
        BEGIN
            RAISERROR(N'禁止人为更改密码过期时间,更改操作终止。',16,1)
            ROLLBACK TRANSACTION
        END
    END
  • 相关阅读:
    [NOIP2006] 提高组 洛谷P1064 金明的预算方案
    [NOIP2006] 提高组 洛谷P1063 能量项链
    [NOIP2006] 提高组 洛谷P1065 作业调度方案
    [NOIP2005] 提高组 洛谷P1051 谁拿了最多奖学金
    [NOIP2005] 提高组 洛谷P1054 等价表达式
    [NOIP2005] 提高组 洛谷P1053 篝火晚会
    [NOIP2005] 普及组 循环
    Bzoj3622 已经没有什么好害怕的了
    [NOIP2006] 普及组
    Bzoj1008 [HNOI2008]越狱
  • 原文地址:https://www.cnblogs.com/insus/p/2344163.html
Copyright © 2011-2022 走看看