在存储过程中验证用户

时间:2016-05-18 19:29:03

标签: sql-server stored-procedures

我是sql的新手,我不确定我的存储过程有什么问题。

用户输入用户名&密码是我的输入参数,如果正确则返回'登录成功',如果UN不正确而不是返回'错误的UN'或者如果PW不正确则返回'错误的PW'。在存储过程中,我有一个IF Else语句,它只是命中第一个IF语句而不是其他语句。

请查看我的存储过程:

CREATE PROCEDURE [dbo].[AuthenticateUser]
@UserName varchar(15),
@Password varchar(15),
@Role varchar(25) OUTPUT
AS
    SET NOCOUNT ON
BEGIN
    DECLARE @UN VARCHAR(25)
    DECLARE @PW VARCHAR(25)
    SELECT @UN = UserName, @PW = Password FROM LogIn 
        IF (@UN != @UserName COLLATE SQL_Latin1_General_CP1_CS_AS)
            BEGIN
                SET @Role = 'Incorrect User Name'
            END
        ELSE
            BEGIN
                IF (@PW != @Password COLLATE SQL_Latin1_General_CP1_CS_AS)
                    BEGIN
                        SET @Role = 'Incorrect Password'
                    END
                ELSE
                    BEGIN
                        SET @Role = 'Logged in Successfully'
                    END
            END
    SELECT @Role
END

感谢您的帮助

4 个答案:

答案 0 :(得分:0)

将其更改为SELECT COUNT(1)FROM userLogin ....然后在SqlDataReader对象上使用ExecuteScalar()。

作为旁注,将密码以明文形式存储在数据库中并不是一个好主意,而是将它们哈希,最好是使用盐值。

答案 1 :(得分:0)

你这样做:

 mRecyclerView.setLayoutManager(layoutManager);
    mRecyclerView.addOnScrollListener(new EndlessRecyclerOnScrollListener(linearLayoutManager) {
        @Override
        public void onLoadMore(int current_page) {
            Log.d("SCROLL PAST UPDATE", "You hit me");

            //maintain scroll position
            int lastFirstVisiblePosition = ((LinearLayoutManager) mRecyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition();
            ((LinearLayoutManager) mRecyclerView.getLayoutManager()).scrollToPosition(lastFirstVisiblePosition);

            loadMore(jsonSubreddit);
        }
    });

这些比较SELECT @UN = UserName, @PW = Password FROM LogIn IF (@UN != @UserName COLLATE SQL_Latin1_General_CP1_CS_AS) @UN = UserName应在@PW = Password子句中进行,以帮助正确过滤行。

以下是重写的代码(您可以更改为使用自己的表名)

WHERE

最后提供的三个示例向您展示了当您为其提供良好的登录或任一参数不正确时该过程的行为。

答案 2 :(得分:0)

请改为尝试:

applications + license + lease AS GrandTotal 

答案 3 :(得分:0)

一般来说,为攻击者提供一个提示并不是一个好主意,而且名称是可以的,现在猜测一下这个问题。#34;此外,密码至少应区分大小写。为此目的:

select @un=username from LogIn 
where username=@username 
and cast(password as varbinary(max)) = cast(@password as varbinary(max))

if @un is null
   set @role = 'UN or PWD is incorrect'
else
   set @role = 'Success'

如果您想提供提示:

select @un=username from LogIn 
where username=@username 

if @un is null
   set @role = 'UN not found'
else
begin
   select @un=username from LogIn 
   where username=@username 
   and cast(password as varbinary(max)) = cast(@password as varbinary(max))
   if @un is null
      set @role = 'password incorrect'
   else
      set @role = 'Success'
end

P.S。:我希望用户名在您的表中是唯一的。