Bootstrap+Thinkphp3.2+Auth认证+jquery-validator后台

原文:Bootstrap+Thinkphp3.2+Auth认证+jquery-validator后台

Auth权限认证

本例采用auth权限认证,用户和用户组采用多对多关系处理,自动添加rule规则,带有jquery-validator插件,自动控制菜单显示或隐藏。

 

config.php中的配置

‘AUTH_CONFIG‘=>array(

‘AUTH_ON‘ => true, //认证开关

‘AUTH_TYPE‘ => 1, // 认证方式,1为时时认证;2为登录认证。

‘AUTH_GROUP‘ => ‘think_auth_group‘, //用户组数据表名

‘AUTH_GROUP_ACCESS‘ => ‘think_auth_group_access‘, //用户组明细表

‘AUTH_RULE‘ => ‘think_auth_rule‘, //权限规则表

‘AUTH_USER‘ => ‘think_user‘//用户信息表

)

 

第一步、Thinkphp3.2中的library下有Auth.class.php有所需的三个表及注释。创建数据表。自己还需建一张用户表。

n       think_auth_rule,规则表(存放所有的权限规则)

n       think_auth_group 用户组表(存放一个用户组有哪些权限)

n       think_auth_group_access 用户组明细表(其实就是叫用户表和用户组的中间表)

n       think_user 用户表(需自建)

 

第二步、config.php中配置auth认证。

‘AUTH_CONFIG‘=>array(

‘AUTH_ON‘ => true, //认证开关

‘AUTH_TYPE‘ => 1, // 认证方式,1为时时认证;2为登录认证。

‘AUTH_GROUP‘ => ‘think_auth_group‘, //用户组数据表名

‘AUTH_GROUP_ACCESS‘ => ‘think_auth_group_access‘, //用户组明细表

‘AUTH_RULE‘ => ‘think_auth_rule‘, //权限规则表

‘AUTH_USER‘ => ‘think_user‘//用户信息表

)

 

第三步、需要验证的类都继承CommonController。创建CommonController.class.php文件。(此类针对多入口的情况)

<?php

namespace Admin\Controller;

use Think\Controller;

class CommonController extends Controller {

public function _initialize () {

if(!isset($_SESSION[C(‘USER_AUTH_KEY‘)])){ //判断是否有uid

$this->redirect("Public/login");

}

$Auth = new \Think\Auth();

$module_name=CONTROLLER_NAME.‘/‘.ACTION_NAME;

if($_SESSION[‘uname‘]==C(‘ADMIN_AUTH_KEY‘)){  //以用户名来判断是否是超级管理员,绕过验证,不用用户组来判断的原因是用户组有时候是中文  ,而且常删除或更改。

return true;

}

if(!$Auth->check($module_name,$_SESSION[C(‘USER_AUTH_KEY‘)])){

$this->error(‘没有权限‘);

}

}

}

 

第四步、登录验证的PublicController和以前都差不多。创建PublicController.class.php

<?php

namespace Admin\Controller;

use Think\Controller;

class PublicController extends Controller {

public function index(){

$this->display();

}

//登录页

public function login(){

$this->display();

}

//登出

public function logout(){

if($_SESSION[C(‘USER_AUTH_KEY‘)]) {

session_destroy();

$this->redirect("Public/login");

}else {

$this->error(‘已经登出!‘);

}

}

//验证登陆表单

public function checkLogin(){

$username=I(‘username‘,‘‘);

$password=I(‘password‘,‘‘);

$verify_code=I(‘verify‘,‘‘);

if($username==‘‘||$password==‘‘||$verify_code==‘‘){

$this->redirect("Public/login");

}

if(!$this->_verifyCheck($verify_code)){

$this->error("验证码错误!!!");

}

$user=M(‘user‘)->where(array(‘username‘=>$username))->find();

if(!$user||md5($password)!=$user[‘password‘]){

$this->error("用户名或密码错误!!!");

}

if(!$user[‘status‘]){   //status为0时表示锁定

$this->error("用户被锁定!!!");

}else{

$data[‘login_ip‘] =  get_client_ip();

$data[‘last_login_time‘]=time();

if(M("user")->where(array(‘id‘=>$user[‘id‘]))->save($data)){

M("user")->where(array(‘id‘=>$user[‘id‘]))->setInc("login_num");

}

session(C(‘USER_AUTH_KEY‘),$user[‘id‘]);

session(‘uname‘,$user[‘username‘]);

$this->success("登录成功...",U("Index/index"));

}

}

//验证码

public function verify(){

$config = array(

‘fontSize‘    =>    20,     // 验证码字体大小

‘length‘      =>    1,      // 验证码位数

‘useNoise‘    =>   false,  // 关闭验证码杂点

‘imageH‘    =>  50,          // 验证码图片高度

‘imageW‘    =>  200,          // 验证码图片宽度

);

$Verify =new \Think\Verify($config);

$Verify->entry();

}

//验证验证码

private function _verifyCheck($code, $id = ‘‘){

$verify = new \Think\Verify();

return $verify->check($code, $id);

}

}

到这里,auth的权限认证就基本完成

第五步、创建AuthController.class.php(逻辑代码如下,就是一些CURD),多加了一个register方法,用来自动把规则的放入数据库中.本人把register放在function.php中方便其他类调用。用户和用户组采用多对多的关系处理,方便权限更为精细。

<?php

namespace Admin\Controller;

use Think\Controller;

class AuthController extends CommonController {

//Auth认证管理

public function index(){

//获取用户信息

$user=D("user")->relation(true)->field("password",true)->select();

$this->user=$user;

//获取用户组信息

$group=M("auth_group")->select();

$obj=M("auth_rule");

foreach($group as $k=>$v){

$map[‘id‘] = array(‘in‘,$group[$k][‘rules‘]);

$group[$k][‘group‘]=$obj->where($map)->select();

}

$this->group=$group;

//获取rule规则

$this->rule=M("auth_rule")->select();

//$ip = new \Org\Net\IpLocation("UTFWry.dat");

//$location=$ip->getlocation();

//p($location);die;

//p($group);die;

$this->display();

}

//添加后台用户及表单处理

public function user(){

if(IS_POST){

$data=array(

‘username‘=>I(‘username‘,‘‘,‘trim‘),

‘remark‘=>I(‘remark‘,‘‘,‘trim‘),

‘password‘=>I(‘password‘,‘‘,‘md5‘),

‘status‘=>I(‘status‘,0,‘intval‘),

‘rsgtime‘=>$_SERVER[‘REQUEST_TIME‘],

‘login_num‘=>0

);

if(!isset($_POST[‘role_id‘])){

$this->error("请选择用户组...");

}

if($data[‘password‘]!=md5($_POST[‘repassword‘])){

$this->error("两次密码不一致...");

}

if(M("user")->where(array(‘username‘=>$data[‘username‘]))->find()){

$this->error("用户名已存在...");

}

if($lastInsertId=M("user")->add($data)){

foreach($_POST[‘role_id‘] as $k=>$v){

$arr=array(

‘uid‘=>$lastInsertId,

‘group_id‘=>$_POST[‘role_id‘][$k]

);

M("auth_group_access")->add($arr);

}

M("auth_group_access")->add($arr);

$this->success("添加成功...",U("Auth/index"));

}else{

$this->error("添加失败...");

}

}else{

$this->group=M("auth_group")->field("id,title")->select();

$this->display();

}

}

//添加后台用户组及表单处理

public function group(){

if(IS_POST){

$data=array(

‘title‘=>I(‘title‘,‘‘,‘trim‘),

‘status‘=>I(‘status‘,0,‘intval‘)

);

if(M("auth_group")->where(array(‘title‘=>$data[‘title‘]))->find()){

$this->error("用户组名称已存在...");

}

if(M("auth_group")->add($data)){

$this->success("添加成功...",U("Auth/index"));

}else{

$this->error("添加失败...");

}

}else{

$this->display();

}

}

//添加后台权限及表单处理

public function auth(){

if(IS_POST){

$data=array(

‘name‘=>I(‘name‘,‘‘,‘trim‘),

‘title‘=>I(‘title‘,‘‘,‘trim‘),

‘condition‘=>I(‘condition‘,‘‘,‘trim‘),

‘status‘=>I(‘status‘,0,‘intval‘),

‘type‘=>I(‘type‘,0,‘intval‘),

);

if(M("auth_rule")->add($data)){

$this->success("添加成功...",U("Auth/index"));

}else{

$this->error("添加失败...");

}

}else{

$this->display();

}

}

//注册rule规则

public function register(){

$class_name=get_class();

return register($class_name);

}

//删除用户组

public function deleteGroup(){

if(IS_GET){

if(!isset($_GET[‘id‘])){

return false;

}

$id=I("id",0,"intval");

if(!$id){

return false;

}

if(M("auth_group")->where(array("id"=>$id))->delete()){

M("auth_group_access")->where(array("group_id"=>$id))->delete();

$this->success("删除成功...",U("Auth/index"));

}else{

$this->error("删除失败...");

}

}

}

//修改用户组

public function modifyGroup(){

if(IS_GET){

if(!isset($_GET[‘id‘])){

return false;

}

$id=I("id",0,"intval");

if(!$id){

return false;

}

$group=M("auth_group")->where(array("id"=>$id))->find();

$rule=M("auth_rule")->select();

foreach($rule as $k=>$v){

if(in_array($rule[$k][‘id‘],explode(‘,‘,$group[‘rules‘]))){

$rule[$k][‘is_checked‘]=1;

}else{

$rule[$k][‘is_checked‘]=0;

}

}

$this->rule=$rule;

$this->group=$group;

$this->id=$id;

//p($rule);die;

$this->display();

}elseif(IS_POST){

$data=array(

‘title‘=>I("title","","trim"),

‘rules‘=>implode(",",$_POST[‘rule‘]),

‘status‘=>I("status","","trim")

);

if(M("auth_group")->where(array("id"=>$_POST[‘id‘]))->save($data)){

$this->success("修改成功...",U("Auth/index"));

}else{

$this->error("修改失败...");

}

}

}

//删除RULE

public function deleteRule(){

if(IS_GET){

if(!isset($_GET[‘id‘])){

return false;

}

$id=I("id",0,"intval");

if(!$id){

return false;

}

if(M("auth_rule")->where(array("id"=>$id))->delete()){

$this->success("删除成功...",U("Auth/index"));

}else{

$this->error("删除失败...");

}

}

}

//修改RULE

public function modifyRule(){

if(IS_POST){

if(!isset($_POST[‘id‘])){

return false;

}

$id=I("id",0,"intval");

unset($_POST[‘id‘]);

if(!$id){

return false;

}

if(M("auth_rule")->where(array("id"=>$id))->save($_POST)){

$this->success("修改成功...",U("Auth/index"));

}else{

$this->error("修改失败...");

}

}

}

//删除用户

public function deleteUser(){

if(IS_GET){

if(!isset($_GET[‘id‘])){

return false;

}

$id=I("id",0,"intval");

if(!$id){

return false;

}

if(M("user")->where(array("id"=>$id))->delete()){

M("auth_group_access")->where(array("uid"=>$id))->delete();

$this->success("删除成功...",U("Auth/index"));

}else{

$this->error("删除失败...");

}

}

}

//修改用户

public function modifyUser(){

if(IS_POST){

$id=I("id",0,"intval");

if(!$id){

return false;

}

$data[‘username‘]=I("username","","trim");

$data[‘remark‘]=I("remark","","trim");

$data[‘status‘]=I("status",0,"intval");

$tmp=0;

if(isset($_POST[‘role_id‘])){

M("auth_group_access")->where(array("uid"=>$id))->delete();

foreach ($_POST[‘role_id‘] as $key => $value) {

if(M("auth_group_access")->add(array("uid"=>$id,"group_id"=>$_POST[‘role_id‘][$key]))){

$tmp=1;

}

}

}

if(trim($_POST[‘password‘])){

if(md5($_POST[‘password‘])!=md5($_POST[‘repassword‘])){

$this->error("两次密码输入不一致...");

}else{

$data[‘password‘]=I("password","","md5");

}

}

if(M("user")->where(array("id"=>$id))->save($data)){

$this->success("修改成功...",U("Auth/index"));

}else{

if($tmp){

$this->success("修改成功...",U("Auth/index"));

}else{

$this->error("修改失败...");

}

}

}elseif(IS_GET){

if(!isset($_GET[‘id‘])){

return false;

}

$id=I("id",0,"intval");

if(!$id){

return false;

}

$this->user=M("user")->where(array(‘id‘=>$id))->field("password",true)->find();

$user_group=M("auth_group_access")->where(array("uid"=>$id))->select();

$group=M("auth_group")->select();

foreach($user_group as $key => $value){

$user_group[$key][‘group_name‘]=M("auth_group")->where(array("id"=>$user_group[$key][‘group_id‘]))->getField("title");

}

$this->user_group=$user_group;

$this->group=$group;

$this->display();

}

}

}

 

function.php如下:(authCheck方法会在模板中有使用,用来控制菜单等显示或隐藏,不需自己写sql来循环判断显不显示

/**

* 注册rule规则

* @param class_name string  类的名称

* @return str           返回错误或者正确信息

*/

function register($class_name){

$data=get_class_methods($class_name);

//把一些父类的方法过滤掉    $arr=array(‘_initialize‘,‘__set‘,‘__construct‘,‘display‘,‘show‘,‘fetch‘,‘buildHtml‘,‘theme‘,‘assign‘,‘ __set‘,‘get‘,‘__get‘,‘__isset‘,‘__call‘,‘error‘,‘success‘,‘ajaxReturn‘,‘redirect‘,‘__destruct‘);

foreach($arr as $k=>$v){

if(in_array($arr[$k],$data)){

$tmp=array_keys($data,$arr[$k]);

unset($data[$tmp[0]]);

}

}

$obj=M("auth_rule");

$msg=‘‘;

foreach($data as $k=>$v){

$data[$k]=CONTROLLER_NAME.‘/‘.$data[$k];

if(!$obj->where(array(‘name‘=>$data[$k]))->find()){

if($obj->add(array(‘name‘=>$data[$k]))){

$msg=$msg.$data[$k].‘注册成功\n‘;

}else{

$msg=$msg.$data[$k].‘注册失败\n‘;

}

}else{

$msg=$msg.$data[$k].‘已注册\n‘ ;

}

}

echo "<script>alert(‘".$msg."‘);history.back(-1);</script>";

}

/**

* 控制模板中菜单的显示

* @param rule string|array  需要验证的规则列表,支持逗号分隔的权限规则或索引数组

* @param uid  int           认证用户的id

* @param string mode        执行check的模式

* @param relation string    如果为 ‘or‘ 表示满足任一条规则即通过验证;如果为 ‘and‘则表示需满足所有规则才能通过验证

* @return boolean           通过验证返回true;失败返回false

*/

function authCheck($rule,$uid,$type=1, $mode=‘url‘, $relation=‘or‘){

$auth=new \Think\Auth();

//获取当前uid所在的角色组id

//$groups=$auth->getGroups($uid);

if($_SESSION[‘uname‘]==C(‘ADMIN_AUTH_KEY‘)){

return true;

}

return $auth->check($rule,$uid,$type,$mode,$relation)?true:false;

}

 

注:模板中使用authCheck的方法,在你需要进行显示或者隐藏的地方加上条件就可以了。

<ul class="nav nav-tabs nav-stacked main-menu">

<if condition="authCheck(‘Auth/index‘,$_SESSION[C(‘USER_AUTH_KEY‘)])">

<li class="nav-header hidden-tablet"><i class="icon-user"></i> Auth权限认证 </li>

<li>

<a class="ajax-link" href="{:U(‘Auth/index‘)}"><span class="hidden-tablet">&nbsp;&nbsp;&nbsp;<i class="icon-th"></i> Auth认证 </span></a>

</li>

</if>

</ul>

 

最后一步、创建UserModel.class.php

<?php

/**

* Created by PhpStorm.

* User: Administrator

* Date: 14-10-20

* Time: 下午12:54

*/

namespace Admin\Model;

use Think\Model\RelationModel;

class UserModel extends RelationModel{

//关联查询用户所属的用户组

protected $_link = array(

‘auth_group‘ => array(

‘mapping_type‘ => self::MANY_TO_MANY,

‘class_name‘ => ‘auth_group‘,

‘mapping_name‘ => ‘classify‘,

‘foreign_key‘ => ‘uid‘,

‘relation_foreign_key‘ => ‘group_id‘,

‘relation_table‘ => ‘think_auth_group_access‘

)

);

}

 

时间: 2024-12-17 02:57:45

Bootstrap+Thinkphp3.2+Auth认证+jquery-validator后台的相关文章

thinphp中auth认证方法使用

一.获取Auth类1.ThinkPHP3.1.3完整版:http://www.thinkphp.cn/down/338.html2.OneThink1.0正式版:https://github.com/liu21st/onethink 二.建立需要的数据表打开Auth.class.php,将其中有关数据库的注释部分复制后,到phpmyadmin中执行,可得到三个表:think_auth_rule.think_auth_group.think_auth_group_access,并按实际情况修改前缀

jQuery.validator.addMethod自定义验证

jQuery.validator.addMethod("numOrLetter", function(value, element) { return this.optional(element) || /^[0-9|A-Z|a-z]+$/.test(value);}, "请输入数字或字母"); $("#inputForm").validate({    rules : {        //要校验的表单名称        operationCo

Django之中间件及Auth认证模块

CBV加装饰器 # 写一个装饰器验证session def login_auth(func): def inner(request,*args,**kwargs): if request.session.get('is_login'): return func(request,*args,**kwargs) else: return redirect('/login/') return inner # 写一个类作为网站主页,必须登陆才能访问 # 给里面的get,post方法加装饰器 class

Python Django 生命周期 中间键 csrf跨站请求伪造 auth认证模块 settings功能插拔式源码

一 django 生命周期 二 django中间键 1.什么是中间键 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功能. 简单来说就相当于django门户,保安:它本质上就是一个自定义类,类中定义了几个方法. 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models): 响应走的时候也需要经过中间件才能到达w

Django框架之 auth认证模块

目录 一.Auth模块是什么 二.Auth模块的使用 2.1 User对象的属性 三.扩展auth_user表的字段 3.1 通过AbstractUser类来进行扩展 再次注意: 一.Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点.它内置了强大的用

ios开发使用Basic Auth 认证方式

我们app的开发通常有2种认证方式   一种是Basic Auth,一种是OAuth:现在普遍还是使用OAuth的多,而使用Basic Auth认证的少,正好呢我今天给大家介绍的就是使用的比较少的Badic Auth认证方式,这种认证方式开发和调试简单, 没有复杂的页面跳转逻辑和交互过程,更利于发起方控制.然而缺点就是安全性更低,不过也没事,我们可以使用https安全加密协议,这样才更安全. 我使用的是AFNetworking发送的网络请求,因此我们用Basic Auth认证方式就不能再使用AF

客户端验证的极品--jQuery.validator

最近在做一个用户注册登录的页面,资料查寻过程中发现了一个非常不错的客户端验证的极品-jQuery.validate.它是著名的JavaScript包jQuery的一个插件,其实它还有其它的一些插件应该都爽,有待慢慢来学习 官方地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation/ jQuery用户手册:http://jquery.org.cn/visual/cn/index.xml 开发使用起来非常简单明了, 我的代码:

JQuery validator扩展

//validator 扩展 jQuery.validator.addMethod("mail", function(value, element, messages) { return this.optional(element) || /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(value); }, "请输入合法邮箱"); jQuery.validator.addM

jQuery.validator 验证规则详解

前言:jQuery.validator是一款非常不错的表单验证插件,验证方式非常简单方便,它还对HTML5做了兼容处理,了解了验证规则,就基本掌握了它的使用,下面就让我一一道来 jQuery.validator 验证规则 一.在元素的class属性中添加需要验证的规则,多个规则以空格隔开 <label>邮箱:</label> <input class="required email" type="text" name="ema