本文目錄一覽:
- 1、如何用php做個登陸界面?
- 2、thinkphp 怎麼做登錄驗證
- 3、php登陸驗證頁面代碼
- 4、thinkphp 怎樣實現登錄驗證
- 5、php 製作簡單的註冊頁面 登陸頁面 然後驗證
- 6、PHP實現JWT的Token登錄認證
如何用php做個登陸界面?
你可以做一個簡單的例如你只有用戶名和密碼即可那麼你先在數據庫(以mysql為例)中建表例如叫做user 字段為 id name pass分別是編號、用戶名、密碼長度分別是int(8) a_t(自動編號) 主鍵,varchar(50) ,varchar(50) 你可以添加一個測試數據 例如 1,admin,admin//說明密碼這裡不說加密的問題,用明文實現 登錄頁面的代碼:login.php用戶登錄
用戶名:
密 碼:
checklogin.php代碼(檢測登錄): $name=$_POST[name];$pass=$_POST[password];session_start();//這個可以維持登錄狀態,可以參照session的使用\x0d\x0a//登錄檢查函數 function login_state($uid,$user_shell){ $sql=”SELECT * FROM `user` WHERE `name`=’$name'”;\x0d\x0a $query=@mysql_query($sql) or die(mysql_error());\x0d\x0a $us=is_array($row=@mysql_fetch_array($query));\x0d\x0a $user_shell=$us ? $user_shell==$row[password]:FALSE;\x0d\x0a if($user_shell){ echo “alert(‘登錄成功’);”;\x0d\x0a return $row;\x0d\x0a }else{\x0d\x0a echo “alert(‘您暫時不能瀏覽該頁面,請先登錄’);location.href=’login.php’;”;\x0d\x0a } }login_state($name,$password);?>\x0d\x0a希望可以幫到您,如果還有問題可以聯繫2458285853
thinkphp 怎麼做登錄驗證
登錄無非就是驗證用戶名密碼以及驗證碼是否正確,我們可以新建一個CommonAction的公共類,用來校驗權限,其他所有類繼承此類。該類內部寫一個初始化方法,用於驗證,這一講先不詳細講解。繼續說登錄,由於登錄是公開模塊的方法,所以可以新建一個PublicAction類,用於公共的免驗證方法,同時在配置文件中添加
‘NOT_AUTH_MODULE’=’Public’,//默認不需要認證的模塊
‘USER_AUTH_GATEWAY’=’/Public/login’,//默認的認證網關
然後開始編寫Public類,具體代碼如下:
?php
classPublicActionextendsCommonAction{
//驗證碼顯示
publicfunction verify(){
import(“ORG.Util.Image”);
Image::buildImageVerify(4,1,”png”,100,28,”verify”);
}
//驗證是否賬號密碼
function checklogin(){
//此處多餘可自行改為Model自動驗證
if(empty($_POST[‘username’])){
$this-error(‘帳號錯誤!’);
}elseif (empty($_POST[‘password’])){
$this-error(‘密碼必須!’);
}elseif (empty($_POST[‘verify’])){
$this-error(‘驗證碼必須!’);
}
$map=array();
$map[‘username’]=$_POST[‘username’];
$map[‘status’]=array(‘gt’,0);
if($_SESSION[‘verify’]!= md5($_POST[‘verify’])){
$this-error(‘驗證碼錯誤!’);
}
import(‘ORG.Util.RBAC’);
//C(‘USER_AUTH_MODEL’,’User’);
//驗證賬號密碼
$authInfo=RBAC::authenticate($map);
if(empty($authInfo)){
$this-error(‘賬號不存在或者被禁用!’);
}else{
if($authInfo[‘password’]!=md5($_POST[‘password’])){
$this-error(‘賬號密碼錯誤!’);
}else{
$_SESSION[C(‘USER_AUTH_KEY’)]=$authInfo[‘id’];//記錄認證標記,必須有。其他信息根據情況取用。
$_SESSION[’email’]=$authInfo[’email’];
$_SESSION[‘nickname’]=$authInfo[‘nickname’];
$_SESSION[‘user’]=$authInfo[‘username’];
$_SESSION[‘last_login_date’]=$authInfo[‘last_login_date’];
$_SESSION[‘last_login_ip’]=$authInfo[‘last_login_ip’];
//判斷是否為超級管理員
if($authInfo[‘username’]==’admin’){
$_SESSION[C(‘ADMIN_AUTH_KEY’)]=true;
}
//以下操作為記錄本次登錄信息
$user=M(‘User’);
$lastdate=date(‘Y-m-d H:i:s’);
$data=array();
$data[‘id’]=$authInfo[‘id’];
$data[‘last_login_date’]=$lastdate;
$data[‘last_login_ip’]=$_SERVER[“REMOTE_ADDR”];
$user-save($data);
RBAC::saveAccessList();//用於檢測用戶權限的方法,並保存到Session中
$this-assign(‘jumpUrl’,.’/Index/index’);
$this-success(‘登錄成功!’);
}
}
}
//退出登錄操作
function logout(){
if(!empty($_SESSION[C(‘USER_AUTH_KEY’)])){
unset($_SESSION[C(‘USER_AUTH_KEY’)]);
$_SESSION=array();
session_destroy();
$this-assign(‘jumpUrl’,/Code.’/login’);
$this-success(‘登出成功’);
}else{
$this-error(‘已經登出了’);
}
}
}
以上代碼僅實現功能,沒有做優化,有些驗證的操作可以放到model,session也不用一 一賦值,用數組即可,我想已經入門的應該可以自己改的更好。
php登陸驗證頁面代碼
這個很簡單啊,這個要用到session,因為你登陸進去了還是這個頁面,用JS什麼的反而不方便,首先頁面頂部要添加?php session_start(); ?
我來個最簡單的,index.php頁面為登陸頁面
提示:變量$pwd,就是你設置的密碼,親測可用,你可以直接把這個代碼貼到index.php裏面,保證可用
?php
$pwd=’123456′;//設置登陸密碼
if($_SESSION[‘aa’]!=$pwd){
if(@$_POST[‘aa’]!=$pwd){
?
form action=”index.php” method=”post” style=”text-align:center”
請輸入密碼:input name=”aa” type=”text” /
input name=”登陸” type=”submit” id=”登陸” value=”提交” /
/form
?php
exit;
}elseif(@$_POST[‘aa’]==$pwd){
$_SESSION[‘aa’]=$pwd;
}
}
?
thinkphp 怎樣實現登錄驗證
thinkphp 實現登錄驗證代碼如下:
//登錄驗證
public function doLogin(){
$type=I(‘post.type’);
if(!self::check_verify(I(‘post.code’))){
if($type==home){
$this-error(“驗證碼錯誤”,U(“/Home/Index/login”));
}else{
$this-error(“驗證碼錯誤”,U(“Login/login”));
}
}
$accountInfo=M(‘account’)-where(“account='”.I(‘post.account’).”‘ AND (user_type=3 OR user_type=2)”)-find();
if(!$accountInfo){
if($type==home){
$this-error(“賬號不存在”,U(“/Home/Index/login”));
}else{
$this-error(“賬號不存在”,U(“Login/login”));
}
}
if($accountInfo[‘password’]!=md5(I(‘post.password’).”sqysll”)){
if($type==home){
$this-error(“密碼錯誤”,U(“/Home/Index/login”));
}else{
$this-error(“密碼錯誤”,U(“Login/login”));
}
}
$_SESSION[‘user_type’]=$accountInfo[‘user_type’]; //用戶類型
$_SESSION[‘aid’]=$accountInfo[‘id’];
if($type==home){ //0代表官網登錄,1代表醫院醫生後台登錄
$_SESSION[‘type’]=0;
}else{
$_SESSION[‘type’]=1;
}
$this-redirect(‘Index/index’);
}
//(TP3.2自帶)生成驗證碼
public function code(){
ob_clean();
$c=I(‘c’);
$config = array( ‘fontSize’ = 30, // 驗證碼字體大小
‘length’ = 3, // 驗證碼位數
‘useNoise’ = false, // 關閉驗證碼雜點
);
$Verify = new \Think\Verify($config);
$Verify-entry($c);
}
// (TP3.2自帶)檢測輸入的驗證碼是否正確,$code為用戶輸入的驗證碼字符串
function check_verify($code, $id = ”){
$verify = new \Think\Verify();
return $verify-check($code, $id);
}
php 製作簡單的註冊頁面 登陸頁面 然後驗證
user表 字段id int(11) username varchar(20) password varchar(32)
這3個字段就夠了。
html頁面 rel.html
form action=”rel.php” method=”post”
用戶名:input type=”text” name=”name”brbr
密碼:input type=”password” name=”password”brbr
input type=”submit” name=”submit” value=”註冊”
/form
rel.php
?php
//連接數據庫的代碼我就不寫了 你應該會吧?不會百度一下就好了
$submit = isset($_POST[‘submit’]) ? $_POST[‘submit’] : ”;
if($submit){//如果有表單提交
$username = isset($_POST[‘username’]) ? $_POST[‘username’] : ”;
$password = isset($_POST[‘password’]) ? $_POST[‘passowrd’] : ”;
$password = md5($password);
//先查詢數據庫是否存在該用戶名 註:用戶登陸就是等於這個查詢 不過查詢的時候多加一個password 就是WHERE `username` = ‘$username` AND `password` = ‘$password` 就OK拉。
$sqlSelect = “SELECT `username` FROM `user` WHERE `username` = ‘$username'”;
$querySelect = mysql_query($sqlSelect);
@$resultSelect = mysql_fetch_array($querySelect);
if($resultSelect[‘username’]){
echo “scriptalert(‘該用戶名已經存在。’);location.href=’rel.html’;/script”;
}else{//可以註冊。
$sqlInsert = “INSERT INTO `user`(`username`,`password`) VALUES(‘$username’,’$password’)”;
$queryInsert = mysql_query($sqlInsert);
if($queryInsert){//註冊成功
echo “scriptalert(‘恭喜,註冊成功。’);location.href=’這裡寫你註冊成功的頁面地址。’;/script”;
}else{
echo “scriptalert(‘對不起,註冊失敗。’);location.href=’rel.html’;/script”;
}
}
}
?
這就是個簡單的註冊頁面 登陸的話你就把驗證用戶是否存在的那個單拿出來就行了。。
純手打,望採納。
———————-
對啊 那句話就是注釋啊。
PHP實現JWT的Token登錄認證
1、JWT簡介 JSON Web Token(縮寫 JWT),是目前最流行的跨域認證解決方案。
session登錄認證方案:用戶從客戶端傳遞用戶名、密碼等信息,服務端認證後將信息存儲在session中,將session_id放到cookie中。
以後訪問其他頁面,自動從cookie中取到session_id,再從session中取認證信息。
另一類解決方案,將認證信息,返回給客戶端,存儲到客戶端。下次訪問其他頁面,需要從客戶端傳遞認證信息回服務端。
JWT就是這類方案的代表,將認證信息保存在客戶端。
2、JWT 的原理
JWT 的原理是,服務器認證以後,生成一個 JSON格式的 對象,發回給客戶端,就像下面這樣。
{ “用戶名”: “admin”, “角色”: “超級管理員”, “到期時間”: “2019-07-13 00:00:00” }
以後,客戶端與服務端通信的時候,都要發回這個 JSON 對象。服務器完全只靠這個對象認定用戶身份。
為了防止用戶篡改數據,服務器在生成這個對象的時候,會加上簽名(詳見後文)。
服務器不再保存任何 session 數據,也就是服務器變成無狀態了,從而比較容易實現擴展。
3、JWT 的使用方式
客戶端收到服務器返回的 JWT,可以儲存在 Cookie 裏面,也可以儲存在 localStorage。
此後,客戶端每次與服務器通信,都要帶上這個 JWT。你可以把它放在 Cookie 裏面自動發送,但是這樣不能跨域,所以更好的做法是放在 HTTP 請求的頭信息 Authorization 字段裏面。
Authorization: Bearer
另一種做法是,跨域的時候,JWT 就放在 POST 請求的數據體裏面。
4、JWT 的幾個特點
(1)JWT 默認是不加密,但也是可以加密的。生成原始 Token 以後,可以用密鑰再加密一次。
(2)JWT 不加密的情況下,不能將秘密數據寫入 JWT。
(3)JWT 不僅可以用於認證,也可以用於交換信息。有效使用 JWT,可以降低服務器查詢數據庫的次數。
(4)JWT 的最大缺點是,由於服務器不保存 session 狀態,因此無法在使用過程中廢止某個 token,或者更改 token 的權限。也就是說,一旦 JWT 簽發了,在到期之前就會始終有效,除非服務器部署額外的邏輯。
(5)JWT 本身包含了認證信息,一旦泄露,任何人都可以獲得該令牌的所有權限。為了減少盜用,JWT 的有效期應該設置得比較短。對於一些比較重要的權限,使用時應該再次對用戶進行認證。
(6)為了減少盜用,JWT 不應該使用 HTTP 協議明碼傳輸,要使用 HTTPS 協議傳輸。
5、功能實現
JWT功能組件
使用composer安裝 JWT 功能組件
composer require lcobucci/jwt 3.3
封裝JWT工具類
extend/tools/jwt/Token.php
”,//接收人 ‘id’ = ‘3f2g57a92aa’,//token的唯一標識,這裡只是一個簡單示例 ‘sign’ = ‘pinyougou’,//簽名密鑰 ‘issuer’ = ”,//簽發人 ‘expire’ = 3600*24 //有效期 ]; //生成token public static function getToken($user_id){ //簽名對象 $signer = new Sha256(); //獲取當前時間戳 $time = time(); //設置簽發人、接收人、唯一標識、簽發時間、立即生效、過期時間、用戶id、簽名 $token = (new Builder())-issuedBy(self::$_config[‘issuer’]) -canOnlyBeUsedBy(self::$_config[‘audience’]) -identifiedBy(self::$_config[‘id’], true) -issuedAt($time) -canOnlyBeUsedAfter($time-1) -expiresAt($time + self::$_config[‘expire’]) -with(‘user_id’, $user_id) -sign($signer, self::$_config[‘sign’]) -getToken(); return (string)$token; } //從請求信息中獲取token令牌 public static function getRequestToken() { if (empty($_SERVER[‘HTTP_AUTHORIZATION’])) { return false; } $header = $_SERVER[‘HTTP_AUTHORIZATION’]; $method = ‘bearer’; //去除token中可能存在的bearer標識 return trim(str_ireplace($method, ”, $header)); } //從token中獲取用戶id (包含token的校驗) public static function getUserId($token = null) { $user_id = null; $token = empty($token)?self::getRequestToken():$token; if (!empty($token)) { //為了註銷token 加以下if判斷代碼 $delete_token = cache(‘delete_token’) ?: []; if(in_array($token, $delete_token)){ //token已被刪除(註銷) return $user_id; } $token = (new Parser())-parse((string) $token); //驗證token $data = new ValidationData(); $data-setIssuer(self::$_config[‘issuer’]);//驗證的簽發人 $data-setAudience(self::$_config[‘audience’]);//驗證的接收人 $data-setId(self::$_config[‘id’]);//驗證token標識 if (!$token-validate($data)) { //token驗證失敗 return $user_id; } //驗證簽名 $signer = new Sha256(); if (!$token-verify($signer, self::$_config[‘sign’])) { //簽名驗證失敗 return $user_id; } //從token中獲取用戶id $user_id = $token-getClaim(‘user_id’); } return $user_id; } }
修改 public/.htaccess 文件,通過apache重寫,處理 HTTP請求 中的 Authorization 字段
(不處理,php中接收不到 HTTP_AUTHORAZATION 字段信息)
RewriteCond %{HTTP:Authorization} ^(.+)$ RewriteRule .* – [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
測試: application/adminapi/controller/Index.php 中 index 方法
靜態調用封裝的 \tools\jwt\Token 類的 getToken 方法,傳遞一個用戶 id 值,生成 token
靜態調用封裝的 \tools\jwt\Token 類的 getUserId 方法,傳遞一個 token ,獲取用戶 id 值
訪問結果
到此這篇關於PHP實現JWT的Token登錄認證的文章就介紹到這了,希望對大家的學習有所幫助。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/151817.html