5 7 使用者 角色認證

2021-09-22 18:59:39 字數 3966 閱讀 5488

本小節我們實現乙個功能,當使用者插入,修改或者刪除資料時,判斷該操作是否具備應有的許可權。如果許可權不符合就拒絕操作同時提示使用者。

create table `staff` (

`id` int(10) unsigned not null auto_increment comment '員工id',

`name` varchar(50) not null comment '員工名字',

primary key (`id`)

)comment='員工表'

collate='utf8_general_ci'

engine=innodb;

insert into `staff` (`id`, `name`) values

(1, 'neo'),

(2, 'luke'),

(2, 'jack');

staff 是員工表與下面的staff_has_role配合使用,形成員工與許可權一對多關係。

create table `staff_has_role` (

`id` int(10) unsigned not null auto_increment,

`staff_id` int(10) unsigned not null comment '員工id',

`role` enum('create','update','delete') not null comment '角色',

primary key (`id`),

index `fk_staff_has_role_staff` (`staff_id`),

constraint `fk_staff_has_role_staff` foreign key (`staff_id`) references `staff` (`id`) on update cascade on delete cascade

)collate='utf8_general_ci'

engine=innodb;

insert into `staff_has_role` (`id`, `staff_id`, `role`) values

(1, 1, 'create'),

(2, 1, 'delete'),

(3, 1, 'update'),

(4, 2, 'delete'),

(5, 3, 'create');

(6, 3, 'update');

許可權表可以進一步優化,角色擁有組功能,實現顆粒度更細的許可權控制,有情趣看前面的相關章節。

create table `product` (

`id` int(10) unsigned not null auto_increment comment '唯一id',

`name` varchar(10) not null comment '名稱',

`sn` varchar(10) not null comment '序列號',

`price` float not null comment '**',

`amount` smallint(6) not null comment '數量',

`staff_id` int(10) unsigned not null comment '員工id',

`ctime` timestamp not null default current_timestamp comment '建立時間',

`mtime` timestamp null default null on update current_timestamp comment '修改時間',

primary key (`id`),

unique index `sn` (`sn`),

index `fk_product_staff` (`staff_id`),

constraint `fk_product_staff` foreign key (`staff_id`) references `staff` (`id`)

)comment='產品表'

collate='utf8_general_ci'

engine=innodb;

以產品表為例,這裡要實現的是對產品表記錄的許可權控制。例如neo有用插入,修改和刪除許可權,luke的create與update許可權被吊銷,只能刪除他之前建立的資料。而jack只有能建立於更新資料。

下面的三個觸發器完成具體的許可權控制。同樣你可以進一步優化下面的**的許可權顆粒度,使之能控制到具體列,甚至具體的記錄。

create definer=`root`@`%` trigger `product_before_delete` before delete on `product` for each row begin

if not exists(select id from staff where id=old.staff_id and role="delete") then

signal sqlstate '45000' set message_text = 'permission denied', mysql_errno = 1001;

end if;

endcreate definer=`root`@`%` trigger `product_before_insert` before insert on `product` for each row begin

if not exists(select id from staff where id=new.staff_id and role="create") then

signal sqlstate '45000' set message_text = "the staff's role is not correct or it does not exist.", mysql_errno = 1001;

end if;

endcreate definer=`root`@`%` trigger `product_before_update` before update on `product` for each row begin

if not exists(select id from staff where id=new.staff_id and role="update") then

signal sqlstate '45000' set message_text = "the staff's role cannot update data.", mysql_errno = 1001;

end if;

end

neo 測試如下

insert into `test`.`product` (`name`, `sn`, `price`, `amount`, `staff_id`, `ctime`) values ('iphone', '678624', '5000', '77', '1', '2010-08-18 15:38:23');

select last_insert_id();

update `test`.`product` set `name`='htc', `sn`='5544467', `price`='2000' where `id`=2;

delete from `test`.`product` where `id`=1;

luke 測試如下:

insert into `test`.`product` (`name`, `sn`, `price`, `amount`, `staff_id`) values ('nokia', '65722', '800', '55', '2');

/* sql錯誤(1001):the staff's role is not correct or it does not exist. */

update `test`.`product` set `name`='htc', `sn`='5544467', `price`='2000', staff_id=2 where `id`=2;

/* sql錯誤(1001):the staff's role cannot update data. */

mongodb之使用者 認證 角色 許可權管理

前言 使用者許可權管理很重要,只給需要的許可權,防止應用系統漏洞導致脫庫 authentication 認證識別,解決我是誰 authorization 操作授權,我能做什麼 mongodb cr 官方自定義實現認證機制,通過使用者名稱和密碼,通過challenge response方式,來識別和驗...

Shiro(四)授權 角色認證

1 shiroconfig configuration public class shiroconfig 建立defaultwebsecuritymanager安全管理器 bean name defaultwebsecuritymanager public defaultwebsecurityman...

使用者 角色 許可權

最近因為要用到許可權這個東西,感覺腦袋很是有點亂,昨天硬是搞到大半夜才終於理清了思路。現在我就將我的思路和大家分享一下,不敢保證完全正確,大家看看便罷。看看便罷 一般我們使用到 使用者 角色 許可權 這三張表的時候,會發現表裡會有很多字段,然後相對應的外來鍵也是很多,往往我們就容易混亂。現在我這邊列...