“Hi,我看了你这篇 三个随机产生密码的存储过程 最后一种的写法随机产生密码,觉得很好,并应用在我的程序中,但是上星期老板对我说,要在随机产生的密码带有特殊字符。我再次测试过之后,才发现你的函数产生的密码只是大小写英文字母和数字,并无包含特殊字符,我要怎样改它呢?”
上面全文来自QQ留言。
解决你的问题,需要使用上面相同一篇博文的第二种方法相结合,才可以,其实方法还有其它的,下面仅是Insus.NET想到的一种,仅供你参考,有问题,请继续来信,留言或在线讨论:
usp_RandomPassword
ALTER PROCEDURE [dbo].[usp_RandomPassword]
(
@Length INT = 8
)
AS
BEGIN
DECLARE @RandomPassword NVARCHAR(MAX) = N'',@L INT = 1
--下面的变量,你可以自定制需要的特殊字符
DECLARE @SpecialCharacter NVARCHAR(255) = '@#$%&*?'
WHILE @L <= @Length
BEGIN
--下面这句,Insus.NET把2改为3。
DECLARE @R INT = ROUND(RAND() * 3, 0)
SET @RandomPassword = @RandomPassword + CASE @R
WHEN 0 THEN CHAR(ROUND(RAND() * 9 + 48,0))
WHEN 1 THEN CHAR(ROUND(RAND() * 25 + 65,0))
WHEN 2 THEN CHAR(ROUND(RAND() * 25 + 97,0))
WHEN 3 THEN SUBSTRING(@SpecialCharacter, CONVERT(TINYINT,ROUND(RAND() * 6 + 1,0)),1) END --添加此句
SET @L = @L + 1
END
SELECT @RandomPassword
END
(
@Length INT = 8
)
AS
BEGIN
DECLARE @RandomPassword NVARCHAR(MAX) = N'',@L INT = 1
--下面的变量,你可以自定制需要的特殊字符
DECLARE @SpecialCharacter NVARCHAR(255) = '@#$%&*?'
WHILE @L <= @Length
BEGIN
--下面这句,Insus.NET把2改为3。
DECLARE @R INT = ROUND(RAND() * 3, 0)
SET @RandomPassword = @RandomPassword + CASE @R
WHEN 0 THEN CHAR(ROUND(RAND() * 9 + 48,0))
WHEN 1 THEN CHAR(ROUND(RAND() * 25 + 65,0))
WHEN 2 THEN CHAR(ROUND(RAND() * 25 + 97,0))
WHEN 3 THEN SUBSTRING(@SpecialCharacter, CONVERT(TINYINT,ROUND(RAND() * 6 + 1,0)),1) END --添加此句
SET @L = @L + 1
END
SELECT @RandomPassword
END
升级篇,可参考:密码需要带特殊字符(二)
posted @ 2012-02-06 11:17 Insus.NET 阅读(157) 评论(0) 编辑
需要为程序加一些功能,如下表,这些设置可让管理员根据自己实际情况设置,缺省值为0不作任限制。
由于不是全新开发,而是在现在有程序补充功能,Insus.NET不想在程序作过多更改,只好修改存储过程来实现它们。现下面把实现上图highlight的选项功能分享出来。
保持密码原有记录值,只要管理员设置了密码策略之后,用户更改自己的密码时,就会应用到了新密码策略。
首先写一个获取参数值的自定义函数:
udf_GetPasswordParameterValue
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Insus.NET
-- Create date: 2012-02-05
-- Description: Get Password Parameter Value
-- =============================================
CREATE FUNCTION [dbo].[udf_GetPasswordParameterValue]
(
@PasswordParameterId TINYINT
)
RETURNS TINYINT
AS
BEGIN
DECLARE @ReturnValue TINYINT
SELECT @ReturnValue = [ParameterValue] FROM [dbo].[PasswordParameter] WHERE [PasswordParameterId] = @PasswordParameterId
Return @ReturnValue
END
GO
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Insus.NET
-- Create date: 2012-02-05
-- Description: Get Password Parameter Value
-- =============================================
CREATE FUNCTION [dbo].[udf_GetPasswordParameterValue]
(
@PasswordParameterId TINYINT
)
RETURNS TINYINT
AS
BEGIN
DECLARE @ReturnValue TINYINT
SELECT @ReturnValue = [ParameterValue] FROM [dbo].[PasswordParameter] WHERE [PasswordParameterId] = @PasswordParameterId
Return @ReturnValue
END
GO
接下来,Insus.NET要修改有更改密码的的存储过程:
usp_Users_UpdatePassword
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Insus.NET
-- Create date: 2008-12-26
-- Update date: 2012-06-05 23:11:19
-- Description: Update User Password
-- =============================================
ALTER PROCEDURE [dbo].[usp_Users_UpdatePassword]
(
@ID INT,
@OldPassword nvarchar(30),
@Password nvarchar(30)
)
AS
--判断用户输入的密码是否正确
IF NOT EXISTS(SELECT TOP 1 * FROM [Users] WHERE [Password] = @OldPassword AND [UsersId] = @ID)
BEGIN
RAISERROR(N'旧密码输入不正确,无法更新!',16,1)
RETURN
END
--下面两个变量,是从密码策略表获取最小长度与最大长度值
DECLARE @PasswordLengthMin TINYINT = [dbo].[udf_GetPasswordParameterValue](3)
DECLARE @PasswordLengthMax TINYINT = [dbo].[udf_GetPasswordParameterValue](4)
--如果大于0,说明设置了密码最小长度策略
IF @PasswordLengthMin > 0 AND LEN(@Password) < @PasswordLengthMin
BEGIN
RAISERROR(N'密码最小长度必须大于或等于%d字符。',16,1,@PasswordLengthMin)
RETURN
END
--如果大于0,说明设置了密码最大长度策略
IF @PasswordLengthMax > 0 AND LEN(@Password) > @PasswordLengthMax
BEGIN
RAISERROR(N'密码最大长度必须小于或等于%d字符。',16,1,@PasswordLengthMax)
RETURN
END
--更新密码
UPDATE [Users] SET [Password] = @Password WHERE [UsersId] = @ID
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Insus.NET
-- Create date: 2008-12-26
-- Update date: 2012-06-05 23:11:19
-- Description: Update User Password
-- =============================================
ALTER PROCEDURE [dbo].[usp_Users_UpdatePassword]
(
@ID INT,
@OldPassword nvarchar(30),
@Password nvarchar(30)
)
AS
--判断用户输入的密码是否正确
IF NOT EXISTS(SELECT TOP 1 * FROM [Users] WHERE [Password] = @OldPassword AND [UsersId] = @ID)
BEGIN
RAISERROR(N'旧密码输入不正确,无法更新!',16,1)
RETURN
END
--下面两个变量,是从密码策略表获取最小长度与最大长度值
DECLARE @PasswordLengthMin TINYINT = [dbo].[udf_GetPasswordParameterValue](3)
DECLARE @PasswordLengthMax TINYINT = [dbo].[udf_GetPasswordParameterValue](4)
--如果大于0,说明设置了密码最小长度策略
IF @PasswordLengthMin > 0 AND LEN(@Password) < @PasswordLengthMin
BEGIN
RAISERROR(N'密码最小长度必须大于或等于%d字符。',16,1,@PasswordLengthMin)
RETURN
END
--如果大于0,说明设置了密码最大长度策略
IF @PasswordLengthMax > 0 AND LEN(@Password) > @PasswordLengthMax
BEGIN
RAISERROR(N'密码最大长度必须小于或等于%d字符。',16,1,@PasswordLengthMax)
RETURN
END
--更新密码
UPDATE [Users] SET [Password] = @Password WHERE [UsersId] = @ID
posted @ 2012-02-06 10:22 Insus.NET 阅读(108) 评论(0) 编辑


