Iam使用内置功能授权我的用户。但是没有设置用户名全局的胖子?找不到它
$angemeldet = new \DB\SQL\Mapper($this->db, 'users');
$auth = new \Auth($angemeldet, array('id'=>'name', 'pw'=>'email'));
$auth->basic(); // a network login prompt will display to authenticate the user
这很有效。
http://www.willis-owen.co.uk/2013/02/blog-tutorial-with-fat-free-framework-v3/ 在这里,我发现他正在SESSION中设置它。但是,如果我尝试访问它,它的完全空。我在哪里可以找到用户名?
我该如何操纵密码?所以我可以比较哈希?
答案 0 :(得分:1)
请看下面的代码:
public function verify($f3, $params) {
$username = $f3->get('POST.email');
$password = $f3->get('POST.password');
$hashedPassword = md5($password);
$submit = $f3->get('POST.submit');
if (isset($submit)) {
global $db;
$user = new DB\SQL\Mapper($db, 'users');
// username is email, password is password in our case
$auth = new \Auth($user, array('id' => 'email', 'pw' => 'password'));
$loginResult = $auth->login($username, $hashedPassword); // Cross-check with users with hashedPassword
// Authenticated the user successfully
if ($loginResult == true) {
$f3->set('message', 'Logged in successfully.');
$f3->reroute('/login');
}
} else {
$f3->set('message', 'Please enter valid username/password');
}
$f3->reroute('/login');
}
在上面的代码中,您可以看到我在密码中使用了md5哈希。这可能会让您了解您想要实现的目标。
答案 1 :(得分:1)
默认情况下,F3 Auth不会将用户设置为SESSION
,您必须自己执行此操作。您无法在SESSION
中存储PDO对象,因为它们无法序列化。用户名将存储在SERVER.PHP_AUTH_USER
中,因此您可以使用该用户名来获取$user
。
要散列密码,请将函数传递给$auth->basic( function( $password ){} );
并返回散列密码。将SHA256
与盐一起使用将比MD5
安全得多。
这是我用来做BASIC身份验证的代码。
// I call this from the constructor of the handler of secure pages.
public static function authenticate(){
// map to the users db table
$user = new \DB\SQL\Mapper( F3::get( 'db' ), 'users' );
// tell F3 to use the columns username and password
$auth = new \Auth( $user, array( 'id'=>'username', 'pw'=>'password' ) );
// check to see if they are authed, use a function to create hashed password
$authenticated = $auth->basic( function ( $password ){
$salt = 'Some secure salt string...';
return hash( 'sha256', $password . $salt );
} );
// if we are logged in and the user isn't set....
if ( $authenticated && !F3::exists( 'user' ) ){
// use SERVER.PHP_AUTH_USER to load user by username
$user->load( array( 'username=?', F3::get( 'SERVER.PHP_AUTH_USER' ) ) );
// set user to variable if it could be loaded
if ( !$user->dry() ){
F3::set( 'user', $user );
}
}
}
答案 2 :(得分:0)
检查基本身份验证方法的API文档:http://fatfreeframework.com/auth#basic
我认为它应该像
$auth->basic(function($input){
return md5($input);
});
遗憾的是,此方法不会返回有效登录的任何用户数据。但是由于对象是通过php中的引用传递的,所以如果填充了一些数据,您可以尝试在auth进程之后查看映射器。 var_dump($angemeldet->cast());
答案 3 :(得分:0)
根据我的经验,这是执行基本(浏览器弹出窗口)身份验证的最简单方法:
function renderAdmin() {
$user=new DB\SQL\Mapper($this->db,'users');
$auth== null;
$auth = new \Auth($user, array('id'=>'username', 'pw'=>'password'));
$login_result = $auth->basic();
if ($login_result) $f3->set('SESSION.username','SERVER.PHP_AUTH_USER');
if (!$f3->get('SESSION.username')) $f3->error(401);
else {
// all your code for the admin section
echo \Template::instance()->render('admin.html');
}
}