登录的用户名怎么验证是数据库的

登录的用户名怎么验证是数据库的,第1张

利用 UserDetailsService 和PasswordEncoder 来验证。

UserDetails 是由 UserDetailsService 返回的,由 DaoAuthenticationProvider 来验证 UserDetails,然后返回一个 Authentication

这个 Authentication 持有一个 principal

这个 principal 就是 UserDetailsService 返回的 UserDetails

DaoAuthenticationProvider 是 AuthenticationProvider 接口的一种实现,

DaoAuthenticationProvider 用 UserDetailsService 来获取用于比对的、真实正确的用户名、密码等信息。

Spring Security 对 UserDetailsService 接口默认提供了 in-memory 和 JDBC 两种实现

为了自定义认证,要暴露出一个自己实现的 UserDetailsService Bean

密码加密由 PasswordEncoder 处理,可以暴露一个 PasswordEncoder Bean 来定制

DaoAuthenticationProvider 是 AuthenticationProvider 接口的一种实现,利用 UserDetailsService 和 PasswordEncoder 来认证一对用户名密码

企业管理器-->右键你的实例(就是那个有绿色图标的)-->属性-->安全-->改为sql与window混合

连接字符串中添加:

integrated security = SSPI

即可,不需要再添加UID和password的子串。

Integrated

Security=True;表示在连接数据库进行身份验证时用windows集成的身份验证模式,TRUE可以改成SSPI表示同一个意思,如果为False的话,就会用Userid

和PW的模式进行登陆,也就是说当Integrated

Security=true;时UserID和Pw是不起作用的,只有当其设置为False时数据库才会用UserId和Pw的方式进行登录,可以设成Integrated

Security={true,False,yes,No,SSPi}这几个参数,其中TRUE=yes=SSpI。Pooling=False表示是否使用连接池,False表示不使用连接池,连接池就是有一些与数据库的连接放在里面,建立新的连接时系统会先看里面有没有一样的连接,有就不用新建了。

using System

using System.Collections.Generic

using System.Text

using System.Data

using System.Data.SqlClient

namespace SQL_work

{

class DataConn

{

public static SqlConnection My_con  //定义一个SqlConnection类型的公共变量My_con,用于判断数据库是否连接成功

public static string M_str_sqlcon = @"Data Source=计算机名/SQLEXPRESSInitial Catalog=db_work3Integrated Security=TruePooling=False"

#region  建立数据库连接

/// <summary>

/// 建立数据库连接.

/// </summary>

/// <returns>返回SqlConnection对象</returns>

public static SqlConnection getcon()

{

My_con = new SqlConnection(M_str_sqlcon)   //用SqlConnection对象与指定的数据库相连接

My_con.Open()  //打开数据库连接

return My_con  //返回SqlConnection对象的信息

}

#endregion

#region  测试数据库是否赋加

/// <summary>

/// 测试数据库是否赋加

/// </summary>

public void con_open()

{

getcon()

//con_close()

}

#endregion

#region  关闭数据库连接

/// <summary>

/// 关闭于数据库的连接.

/// </summary>

public void con_close()

{

if (My_con.State == ConnectionState.Open)   //判断是否打开与数据库的连接

{

My_con.Close()   //关闭数据库的连接

My_con.Dispose()   //释放My_con变量的所有空间

}

}

#endregion

#region  读取指定表中的信息

/// <summary>

/// 读取指定表中的信息.

/// </summary>

/// <param name="SQLstr">SQL语句</param>

/// <returns>返回bool型</returns>

public SqlDataReader getcom(string SQLstr)

{

getcon()   //打开与数据库的连接

SqlCommand My_com = My_con.CreateCommand()//创建一个SqlCommand对象,用于执行SQL语句

My_com.CommandText = SQLstr    //获取指定的SQL语句

SqlDataReader My_read = My_com.ExecuteReader()//执行SQL语名句,生成一个SqlDataReader对象

return My_read

}

#endregion

#region 执行SqlCommand命令

/// <summary>

/// 执行SqlCommand

/// </summary>

/// <param name="M_str_sqlstr">SQL语句</param>

public void getsqlcom(string SQLstr)

{

getcon()   //打开与数据库的连接

SqlCommand SQLcom = new SqlCommand(SQLstr, My_con)//创建一个SqlCommand对象,用于执行SQL语句

SQLcom.ExecuteNonQuery()   //执行SQL语句

SQLcom.Dispose()   //释放所有空间

con_close()    //调用con_close()方法,关闭与数据库的连接

}

#endregion

#region  创建DataSet对象

/// <summary>

/// 创建一个DataSet对象

/// </summary>

/// <param name="M_str_sqlstr">SQL语句</param>

/// <param name="M_str_table">表名</param>

/// <returns>返回DataSet对象</returns>

public DataSet getDataSet(string SQLstr, string tableName)

{

getcon()   //打开与数据库的连接

SqlDataAdapter SQLda = new SqlDataAdapter(SQLstr, My_con)  //创建一个SqlDataAdapter对象,并获取指定数据表的信息

DataSet My_DataSet = new DataSet()//创建DataSet对象

SQLda.Fill(My_DataSet, tableName)  //通过SqlDataAdapter对象的Fill()方法,将数据表信息添加到DataSet对象中

con_close()    //关闭数据库的连接

return My_DataSet  //返回DataSet对象的信息

//WritePrivateProfileString(string section, string key, string val, string filePath)

}

#endregion

}

}

刚好上次讲三层架构.有现成的例子

以一个验证登陆为例子

这里是界面层一般叫UIL

protected void Button1_Click(object sender, EventArgs e)

{

List<User>Users = BAL.GetUserInfo(txtUserName.Text,txtPassword.Text)

if(Users.Length >0)

{

Response.Write("登陆成功")

}

else

{

Response.Write("登陆失败")

}

}

以下是逻辑层代码,业务逻辑层一般叫BLL

public static List<User>GetUserInfo(string user,string password)

{

string newPassword = GetMD5Hash(password)//这里对密码进行加密处理,数据库中存放的是经过MD5加密后的密,业务逻辑层一般都是处理复杂的逻辑.例如加密逻辑

List<User>Users = DAL.GetUserInfo(user,newPassword)

return Users

}

以下是数据访问层代码,数据访问层一般叫DAL

public static List<User>GetUserInfo(string user,string password)

{

List<User>Users = new List<User>()

string sql = "select * from User where Password = '"+password+"' and User = '"+user+"'"//写where子句的时候把Password放前面.因为Password经过加密,所以可以防止SQL注入攻击

SqlDataAdapter da = new SqlDataAdapter(sql,"这里是数据库连接字符串")

DataSet ds = new DataSet()

da.Fill(ds)

for(int i=0i<ds.Tables[0].Rows.Counti++)

{

User user = new User(ds.Tables[0].Rows[i]["ID"].ToString(),ds.Tables[0].Rows[i]["User"].ToString(),ds.Tables[0].Rows[i]["Password"].ToString())

Users.Add(user)

}

return Users

}

还会有一个Model层.叫做模板层.是数据表结构的印射.Model层是共用层,其他三层都要用到.

比如数据库中有张表User,里面有3个字段ID,User,Password

那么在模板层中应该有一个类,数据库中User表的一行对应一个User对象,一张表对应User对象的集合.

public class User

{

string ID

string User

string Password

//重载构造函数

User(string id,string user,string password)

{

this.ID=id

this.User=user

this.Password=password

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6803686.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-28
下一篇 2023-03-28

发表评论

登录后才能评论

评论列表(0条)

保存