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
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)