Shrio授权验证详解
所谓授权,就是控制你是否能访问某个资源,比如说,你可以方位page文件夹下的jsp页面,但是不可以访问page文件夹下的admin文件夹下的jsp页面。
在授权中,有三个核心元素:权限,角色,用户。
每个用户可以有多个角色,每个角色也可以有多个权限。
权限:代表了可以执行的行为,例如对表的读写之类的。
角色:代表了一组权限
用户:代表了一个subject,可以为用户赋予角色,或者直接赋予权限。
授权验证详解
在Shiro中共有三种授权的验证方式:编程式、注解式、JSP/GSP标签。
编程授权验证
最早的方式就是通过编程的方式,直接通过Subject来判断权限,角色等。
如果要判断当前用户是否有某个权限,可以通过hasRole方法来判断,如果有某权限的话,则干嘛,没有的话则干嘛。
Subject currentUser = SecurityUtils.getSubject();
if (currentUser.hasRole("administrator")) {
//show the admin button
} else {
//don't show the button? Grey it out?
}
在Shrio中,提供了下面几个检测权限的方式:
| hasRole(String roleName) | 如果当前用户有这个角色,则返回true |
| hasRoles(List<String> roleNames) | 返回一个是否有当前每个角色的结果集 |
| hasAllRoles(Collection<String> roleNames) | 如果有所有的权限的话,则返回true |
另外还有一种方式,就是调用checkRole方法来检测是否有特定的权限,如果有的话,则不会报错,没有的话则会抛出AuthorizationException异常。
Subject currentUser = SecurityUtils.getSubject(); //guarantee that the current user is a bank teller and
//therefore allowed to open the account:
currentUser.checkRole("bankTeller");
openBankAccount();
在Shrio中,也提供了下面的几个方法来检测权限:
| checkRole(String roleName) | 如果没有这个权限则报错 |
| checkRoles(Collection<String> roleNames) | 如果没有这其中的某个权限都会报错 |
| checkRole(String... roleNames) | 如果没有这其中的某个权限都会报错 |
如果要检测是否有某个权限的话,则可以通过isPermitted方法来检测。
这个方法可以接收Permission对象也可以接收字符串的权限信息。
Permission printPermission = new PrinterPermission("laserjet4400n", "print");
Subject currentUser = SecurityUtils.getSubject();
if (currentUser.isPermitted(printPermission)) {
//show the Print button
} else {
//don't show the button? Grey it out?
}
或者
Subject currentUser = SecurityUtils.getSubject();
if (currentUser.isPermitted("printer:print:laserjet4400n")) {
//show the Print button
} else {
//don't show the button? Grey it out?
}
在Shrio里面提供了下面的几个方法来检测权限。
| isPermitted(Permission p) | 如果有这个权限的话就返回true |
| isPermitted(String perm) | 如果有这个权限的话就返回true |
| isPermitted(List<Persisson> perms) | 返回每个权限是否有的true或false的结果集 |
| isPermitted(String ... perms) | 返回每个权限是否有的true或false的结果集 |
| isPermittedAll(Collection<Permission> perms) | 如果拥有所有的权限则返回true |
| isPermittedALL(String ...Perms) | 如果拥有所有的权限则返回true |
跟角色一样,也同样有下面的替换方式:
Subject currentUser = SecurityUtils.getSubject(); //guarantee that the current user is permitted
//to open a bank account:
Permission p = new AccountPermission("open");
currentUser.checkPermission(p);
openBankAccount();
或者
Subject currentUser = SecurityUtils.getSubject(); //guarantee that the current user is permitted
//to open a bank account:
currentUser.checkPermission("account:open");
openBankAccount();
也有下面几种方法:
| checkPermission(Permission p) | 如果没有这个权限就会抛出异常 |
| checkPermission(String perm) | 如果没有这个权限就会抛出异常 |
| checkPermissions(Collection<permission> perms) | 如果没有这些权限中的某一个就会抛出异常 |
| checkPermissions(String ... perms) | 如果没有这些权限中的某一个就会抛出异常 |
注解授权验证
Shiro的注解授权需要Java5以上的支持。
如果要想使用的话,还需要使用AOP的支持。在市面上也有很多中AOP支持,比如apache的Aspectj、Spring之类的。
RequiresAuthentication
这个注解表示要求当前用户对这个类,接口或者方法访问的时候,需要是已经被认证的。
@RequiresAuthentication
public void updateAccount(Account userAccount) {
//this method will only be invoked by a
//Subject that is guaranteed authenticated
...
}
RequireGuest
RequireGuest注解要求当前用户在访问这个类、接口或方法的时候是一个游客,也就是说没有登陆或者通过上演一次登陆的时候记住密码了。
@RequiresGuest
public void signUp(User newUser) {
//this method will only be invoked by a
//Subject that is unknown/anonymous
...
}
RequiresPermissions
RequiresPermission注解要求当前用户用户有着权限。
@RequiresPermissions("account:create")
public void createAccount(Account account) {
//this method will only be invoked by a Subject
//that is permitted to create an account
...
}
RequiresRoles
RequiresRoles注解要求当前用户拥有这个角色才可以访问,否则抛出异常。
@RequiresRoles("administrator")
public void deleteUser(User user) {
//this method will only be invoked by an administrator
...
}
RequiresUser
RequiresUser要求当前用户必须是指定的用户才能够访问这个类、接口或者方法。
@RequiresUser
public void updateAccount(Account account) {
//this method will only be invoked by a 'user'
//i.e. a Subject with a known identity
...
}
JSP/GSP标签授权验证
标签的授权验证用来支持在web开发中的权限控制。
授权顺序
前面我们讲了三种权限的控制方式,接下来我们看看权限控制的流程是什么样的。
下面是一张权限控制的结构图。

Step1:当前用户调用检测角色,权限的方法
step2:当前用户实例(通常是一个DelegatingSubject)通过调用SecurityManager的检测角色权限的方法,把任务转发给SecurityManager。
Step3:SecurityManager作为一个容器,把检测权限的任务转发给内部的验证器,验证器通常默认是一个ModularRealmAuthorizer实例,会通过Realm来检测用户的权限。
Step4:每一个Realm都会被用来检测是否支持当前的认证,支持的话则会调用Realm的方法来检测是否有当前权限。
角色与权限配置
角色域与权限的配置可以在INI文件或者数据库中配置,具体在那取决于我们具体采用哪种Realm的认证方式。
shiro.ini文件中配置
在shiro.ini配置文件中我们可以配置[main],[users],[roles],[urls]四个节,其中[roles]就是用来配置角色与权限的。
例如:
[roles]
# 'admin' role has all permissions, indicated by the wildcard '*'
admin = *
# The 'schwartz' role can do anything (*) with any lightsaber:
schwartz = lightsaber:*
# The 'goodguy' role is allowed to 'drive' (action) the winnebago (type) with
# license plate 'eagle5' (instance specific id)
goodguy = winnebago:drive:eagle5
如果要让某个角色拥有多个权限,则可以用都厚隔开,指定多个权限即可。
实例(通过ini文件):
首先在配置文件中配置权限信息,“*”是通配符。
[users]
fuwh=123456,admin
zhangsan=123,buzhang,yuangong
lisi=12,yuangong [roles]
admin=*
buzhang=bumen:*
yuangong=bumen:diwubu:query
编写登陆权限认证程序:
package com.fuwh.demo; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.Permission;
import org.apache.shiro.authz.permission.WildcardPermission;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class ShiroDemo03 { private static Logger log=LoggerFactory.getLogger(ShiroDemo03.class);
public static void main(String[] args) {
//取得SecurityManager工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");
//取得SecurityManager实例
SecurityManager securityManager=factory.getInstance();
//将securityManager绑定到SecurityUtil
SecurityUtils.setSecurityManager(securityManager); //取得当前用户
Subject subject=SecurityUtils.getSubject(); //使用fuwh来进行登陆验证
if(!subject.isAuthenticated()) {
UsernamePasswordToken token=new UsernamePasswordToken("fuwh","123456");
try {
subject.login(token);
log.info(token.getPrincipal()+"登陆成功!!!");
if(subject.hasRole("admin")) {
log.info(token.getPrincipal()+"有admin的角色");
Permission p1=new WildcardPermission("bumen:*:query");
if(subject.isPermitted(p1)) {
log.info(token.getPrincipal()+"有bumen:*:query的权限");
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("认证失败...");
}
}
subject.logout(); log.debug("*****************************************************************"); if(!subject.isAuthenticated()) {
UsernamePasswordToken token=new UsernamePasswordToken("zhangsan","123");
try {
subject.login(token);
log.info(token.getPrincipal()+"登陆成功!!!");
if(subject.hasRole("yuangong")) {
log.info(token.getPrincipal()+"有yuangong的角色");
Permission p1=new WildcardPermission("bumen:diwubu:query");
if(subject.isPermitted(p1)) {
log.info(token.getPrincipal()+"有bumen:diwubu:query的权限");
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("认证失败...");
}
}
subject.logout(); log.debug("*****************************************************************"); if(!subject.isAuthenticated()) {
UsernamePasswordToken token=new UsernamePasswordToken("lisi","12");
try {
subject.login(token);
log.info(token.getPrincipal()+"登陆成功!!!");
if(subject.hasRole("yuangong")) {
log.info(token.getPrincipal()+"有yuangong的角色");
Permission p1=new WildcardPermission("bumen:diwubu:update");
if(subject.isPermitted(p1)) {
log.info(token.getPrincipal()+"有bumen:diwubu:update的权限");
}else {
log.info(token.getPrincipal()+"没有bumen:diwubu:update的权限");
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("认证失败...");
}
}
subject.logout();
}
}
执行后,输出结果:
2017-08-27 14:08:36,089 [main] INFO [org.apache.shiro.session.mgt.AbstractValidatingSessionManager] - Enabling session validation scheduler...
2017-08-27 14:08:36,640 [main] INFO [com.fuwh.demo.ShiroDemo03] - fuwh登陆成功!!!
2017-08-27 14:08:36,640 [main] INFO [com.fuwh.demo.ShiroDemo03] - fuwh有admin的角色
2017-08-27 14:08:36,641 [main] INFO [com.fuwh.demo.ShiroDemo03] - fuwh有bumen:*:query的权限
2017-08-27 14:08:36,643 [main] INFO [com.fuwh.demo.ShiroDemo03] - zhangsan登陆成功!!!
2017-08-27 14:08:36,643 [main] INFO [com.fuwh.demo.ShiroDemo03] - zhangsan有yuangong的角色
2017-08-27 14:08:36,643 [main] INFO [com.fuwh.demo.ShiroDemo03] - zhangsan有bumen:diwubu:query的权限
2017-08-27 14:08:36,644 [main] INFO [com.fuwh.demo.ShiroDemo03] - lisi登陆成功!!!
2017-08-27 14:08:36,644 [main] INFO [com.fuwh.demo.ShiroDemo03] - lisi有yuangong的角色
2017-08-27 14:08:36,644 [main] INFO [com.fuwh.demo.ShiroDemo03] - lisi没有bumen:diwubu:update的权限
需要解释一下的是,如果某个角色的权限是"*",则代表拥有所有的权限。而如果只想让用户拥有某个部门的员工的所有权限的话怎么办呢?
在Shrio中支持分层的权限写法,例如:emp=bumen:yuangong:*,这样的分层则更容易的对权限来进行控制,
如果角色的权限为emp=bumen:update,则等价于emp=bumen:*:updae。
同时,emp=bumen:yuangong也等价于emp=bumen:yuangong:*。
通过Shiro自带的JdbcRealm
在JdbcReal中,默认的角色与权限的查询是通过静态变量DEFAULT_USER_ROLES_QUERY和DEFAULT_PERMISSIONS_QUERY中定义的sql语句来查询的。
DEFAULT_USER_ROLES_QUERY = "select role_name from user_roles where username = ?";
DEFAULT_PERMISSIONS_QUERY = "select permission from roles_permissions where role_name = ?";
并分别把他们的值赋给userRolesQuery和permissionsQuery。
所以默认情况下是从user_roles表中去查询角色信息,从roles_permissions表中去查询权限信息。
如果需要自定义表名,列名的话,可以通过在配置文件中覆写这两个sql语句。
实例:
首先建立数据库如下:
USE `db_shiro`; DROP TABLE IF EXISTS `users`; CREATE TABLE `users` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`password` varchar(100) DEFAULT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; insert into `users`(`id`,`username`,`password`) values (1,'fuwh',''),(2,'zhangsan',''),(3,'lisi',''); DROP TABLE IF EXISTS `user_roles`; CREATE TABLE `user_roles` (
`username` varchar(20) NOT NULL,
`role_name` varchar(20) NOT NULL,
`role_desc` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `user_roles`(`username`,`role_name`,`role_desc`) values ('fuwh','admin','管理员'),('zhangsan','buzhang','部长'),('lisi','yuangong','员工'),('zhangsan','yuangong','员工'); DROP TABLE IF EXISTS `roles_permissions`; CREATE TABLE `roles_permissions` (
`role_name` varchar(20) NOT NULL,
`permission` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `roles_permissions`(`role_name`,`permission`) values ('admin','*'),('buzhang','bumen:*'),('yuangong','bumen:diwubu:query');
编写配置文件:
[main]
dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
dataSource.driverClass=com.mysql.jdbc.Driver
dataSource.jdbcUrl=jdbc:mysql://localhost:3306/db_shiro
dataSource.user=root
dataSource.password=rootadmin jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource=$dataSource
securityManager.realms=$jdbcRealm
编写授权代码:
package com.fuwh.demo; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.Permission;
import org.apache.shiro.authz.permission.WildcardPermission;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class ShiroDemoJdbc03 { private static Logger log=LoggerFactory.getLogger(ShiroDemoJdbc03.class);
public static void main(String[] args) {
//取得SecurityManager工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro_jdbc.ini");
//取得SecurityManager实例
SecurityManager securityManager=factory.getInstance();
//将securityManager绑定到SecurityUtil
SecurityUtils.setSecurityManager(securityManager); /* 至此为止,简单的从mysql数据库读取realm信息的shiro环境就配置好了 */ //取得当前用户
Subject subject=SecurityUtils.getSubject(); //使用fuwh来进行登陆验证
if(!subject.isAuthenticated()) {
UsernamePasswordToken token=new UsernamePasswordToken("fuwh","123456");
try {
subject.login(token);
log.info(token.getPrincipal()+"登陆成功!!!");
if(subject.hasRole("admin")) {
log.info(token.getPrincipal()+"有admin的角色");
Permission p1=new WildcardPermission("bumen:*:query");
if(subject.isPermitted(p1)) {
log.info(token.getPrincipal()+"有bumen:*:query的权限");
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("认证失败...");
}
}
subject.logout(); log.debug("*****************************************************************"); if(!subject.isAuthenticated()) {
UsernamePasswordToken token=new UsernamePasswordToken("zhangsan","123");
try {
subject.login(token);
log.info(token.getPrincipal()+"登陆成功!!!");
if(subject.hasRole("yuangong")) {
log.info(token.getPrincipal()+"有yuangong的角色");
Permission p1=new WildcardPermission("bumen:diwubu:query");
if(subject.isPermitted(p1)) {
log.info(token.getPrincipal()+"有bumen:diwubu:query的权限");
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("认证失败...");
}
}
subject.logout(); log.debug("*****************************************************************"); if(!subject.isAuthenticated()) {
UsernamePasswordToken token=new UsernamePasswordToken("lisi","12");
try {
subject.login(token);
log.info(token.getPrincipal()+"登陆成功!!!");
if(subject.hasRole("yuangong")) {
log.info(token.getPrincipal()+"有yuangong的角色");
Permission p1=new WildcardPermission("bumen:diwubu:update");
if(subject.isPermitted(p1)) {
log.info(token.getPrincipal()+"有bumen:diwubu:update的权限");
}else {
log.info(token.getPrincipal()+"没有bumen:diwubu:update的权限");
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("认证失败...");
}
}
subject.logout();
}
}
执行结果:
2017-08-27 14:08:36,089 [main] INFO [org.apache.shiro.session.mgt.AbstractValidatingSessionManager] - Enabling session validation scheduler...
2017-08-27 14:08:36,640 [main] INFO [com.fuwh.demo.ShiroDemo03] - fuwh登陆成功!!!
2017-08-27 14:08:36,640 [main] INFO [com.fuwh.demo.ShiroDemo03] - fuwh有admin的角色
2017-08-27 14:08:36,641 [main] INFO [com.fuwh.demo.ShiroDemo03] - fuwh有bumen:*:query的权限
2017-08-27 14:08:36,643 [main] INFO [com.fuwh.demo.ShiroDemo03] - zhangsan登陆成功!!!
2017-08-27 14:08:36,643 [main] INFO [com.fuwh.demo.ShiroDemo03] - zhangsan有yuangong的角色
2017-08-27 14:08:36,643 [main] INFO [com.fuwh.demo.ShiroDemo03] - zhangsan有bumen:diwubu:query的权限
2017-08-27 14:08:36,644 [main] INFO [com.fuwh.demo.ShiroDemo03] - lisi登陆成功!!!
2017-08-27 14:08:36,644 [main] INFO [com.fuwh.demo.ShiroDemo03] - lisi有yuangong的角色
2017-08-27 14:08:36,644 [main] INFO [com.fuwh.demo.ShiroDemo03] - lisi没有bumen:diwubu:update的权限
通过自定义的MyJdbcRealm实现:
创建数据库:
USE `db_shiro`; DROP TABLE IF EXISTS `members`; CREATE TABLE `members` (
`id` INT(4) NOT NULL AUTO_INCREMENT,
`membername` VARCHAR(20) DEFAULT NULL,
`password` VARCHAR(100) DEFAULT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; INSERT INTO `members`(`id`,`membername`,`password`) VALUES (1,'fuwh',''),(2,'zhangsan',''),(3,'lisi',''); DROP TABLE IF EXISTS `roles_permissions`; CREATE TABLE `roles_permissions` (
`role_name` VARCHAR(20) NOT NULL,
`permission` VARCHAR(20) NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO `roles_permissions`(`role_name`,`permission`) VALUES ('admin','*'),('buzhang','bumen:*'),('yuangong','bumen:diwubu:query'); DROP TABLE IF EXISTS `member_roles`; CREATE TABLE `member_roles` (
`membername` VARCHAR(20) NOT NULL,
`role_name` VARCHAR(20) NOT NULL,
`role_desc` VARCHAR(100) DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO `member_roles`(`membername`,`role_name`,`role_desc`) VALUES ('fuwh','admin','管理员'),('zhangsan','buzhang','部长'),('lisi','yuangong','员工'),('zhangsan','yuangong','员工');
编写MyJdbcRealm
package com.fuwh.realm; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedHashSet;
import java.util.Set; import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection; import com.fuwh.util.DbUtil; public class MyJdbcRealm extends AuthorizingRealm{ @Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// TODO Auto-generated method stub
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
Set<String> roleNames=new LinkedHashSet<String>();
Connection conn=DbUtil.getConnection();
String sql="select role_name from member_roles where membername=?";
try {
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1, principals.toString());
ResultSet rs=ps.executeQuery();
while(rs.next()) {
roleNames.add(rs.getString(1));
}
rs.close();
info.setRoles(roleNames);
try {
Set<String> permissions=getPermissions(conn,roleNames);
info.setStringPermissions(permissions);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return info;
} protected Set<String> getPermissions(Connection conn,Set<String> roleNames) throws Exception{
Set<String> permissions=new LinkedHashSet<String>();
String sql="select permission from roles_permissions where role_name=?";
PreparedStatement ps=conn.prepareStatement(sql);
for (String roleName : roleNames) {
ps.setString(1,roleName);
ResultSet rs=ps.executeQuery();
while(rs.next()) {
permissions.add(rs.getString("permission"));
}
rs.close();
}
ps.close();
return permissions;
} @Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// TODO Auto-generated method stub
Connection conn=DbUtil.getConnection();
String sql="select * from members where userName=?";
try {
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1, token.getPrincipal().toString());
ResultSet rs=ps.executeQuery();
while(rs.next()) {
AuthenticationInfo info=new SimpleAuthenticationInfo(rs.getString("userName"),rs.getString("pass"),"salt");
return info;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} }
编写配置文件:
[main]myJdbcRealm=com.fuwh.realm.MyJdbcRealmsecurityManager.realms=$myJdbcRealm
编写权限认证代码:
package com.fuwh.demo; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.Permission;
import org.apache.shiro.authz.permission.WildcardPermission;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class ShiroDemoMyJdbc03 { private static Logger log=LoggerFactory.getLogger(ShiroDemoMyJdbc03.class);
public static void main(String[] args) {
//取得SecurityManager工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro_my_jdbc.ini");
//取得SecurityManager实例
SecurityManager securityManager=factory.getInstance();
//将securityManager绑定到SecurityUtil
SecurityUtils.setSecurityManager(securityManager); /* 至此为止,简单的从mysql数据库读取realm信息的shiro环境就配置好了 */ //取得当前用户
Subject subject=SecurityUtils.getSubject(); //使用fuwh来进行登陆验证
if(!subject.isAuthenticated()) {
UsernamePasswordToken token=new UsernamePasswordToken("fuwh","123456");
try {
subject.login(token);
log.info(token.getPrincipal()+"登陆成功!!!");
if(subject.hasRole("admin")) {
log.info(token.getPrincipal()+"有admin的角色");
Permission p1=new WildcardPermission("bumen:*:query");
if(subject.isPermitted(p1)) {
log.info(token.getPrincipal()+"有bumen:*:query的权限");
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("认证失败...");
}
}
subject.logout(); log.debug("*****************************************************************"); if(!subject.isAuthenticated()) {
UsernamePasswordToken token=new UsernamePasswordToken("zhangsan","123");
try {
subject.login(token);
log.info(token.getPrincipal()+"登陆成功!!!");
if(subject.hasRole("yuangong")) {
log.info(token.getPrincipal()+"有yuangong的角色");
Permission p1=new WildcardPermission("bumen:diwubu:query");
if(subject.isPermitted(p1)) {
log.info(token.getPrincipal()+"有bumen:diwubu:query的权限");
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("认证失败...");
}
}
subject.logout(); log.debug("*****************************************************************"); if(!subject.isAuthenticated()) {
UsernamePasswordToken token=new UsernamePasswordToken("lisi","12");
try {
subject.login(token);
log.info(token.getPrincipal()+"登陆成功!!!");
if(subject.hasRole("yuangong")) {
log.info(token.getPrincipal()+"有yuangong的角色");
Permission p1=new WildcardPermission("bumen:diwubu:update");
if(subject.isPermitted(p1)) {
log.info(token.getPrincipal()+"有bumen:diwubu:update的权限");
}else {
log.info(token.getPrincipal()+"没有bumen:diwubu:update的权限");
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("认证失败...");
}
}
subject.logout();
}
}
点此查看源码:https://github.com/oukafu/shiro
Shrio授权验证详解的更多相关文章
- 转 OAuth 2.0授权协议详解
http://www.jb51.net/article/54948.htm 作者:阮一峰 字体:[增加 减小] 类型:转载 时间:2014-09-10我要评论 这篇文章主要介绍了OAuth 2.0授权 ...
- js正则实现二代身份证号码验证详解
js正则实现二代身份证号码验证详解 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至 ...
- MySQL权限授权认证详解
MySQL权限授权认证详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL权限系统介绍1>.权限系统的作用是授予来自某个主机的某个用户可以查询.插入.修改.删除 ...
- OAuth 2.0 授权认证详解
一.认识 OAuth 2.0 1.1 OAuth 2.0 应用场景 OAuth 2.0 标准目前被广泛应用在第三方登录场景中,以下是虚拟出来的角色,阐述 OAuth2 能帮我们干什么,引用阮一峰这篇理 ...
- [转]OAuth 2.0 - Authorization Code授权方式详解
本文转自:http://www.cnblogs.com/highend/archive/2012/07/06/oautn2_authorization_code.html I:OAuth 2.0 开发 ...
- OAuth 2.0 - Authorization Code授权方式详解
I:OAuth 2.0 开发前期准备 天上不会自然掉馅饼让你轻松地去访问到人家资源服务器里面的用户数据资源,所以你需要做的前期开发准备工作就是把AppKey, AppSecret取到手 新浪获取传送门 ...
- 【WCF】授权策略详解
所谓授权者,就是服务授予客户端是否具有调用某个服务操作的权限. 授权过程可以通过一系列授权策略来进行评估,即每个特定的授权策略都按照各自的需求,衡量一下调用方是否具备访问服务操作的权限.在默认情况下, ...
- SQL Server 连接字符串和身份验证详解
SQL Server .NET Data Provider 连接字符串包含一个由一些属性名/值对组成的集合.每一个属性/值对都由分号隔开. PropertyName1=Value1; ...
- OPTAUTH 两步验证详解
先贴图: 在对外网开放的后台管理系统中,使用静态口令进行身份验证可能会存在如下问题: (1) 为了便于记忆,用户多选择有特征作为密码,所有静态口令相比动态口令而言,容易被猜测和破解: (2) 黑客可以 ...
随机推荐
- 基于pytorch实现word2vec
一.介绍 word2vec是Google于2013年推出的开源的获取词向量word2vec的工具包.它包括了一组用于word embedding的模型,这些模型通常都是用浅层(两层)神经网络训练词向量 ...
- 使用 QDockWidget嵌套布局来实现复杂界面,方便用户可以自定义界面,自由组合窗口
http://www.cnblogs.com/findumars/p/5436533.html
- 如何在python脚本里面连续执行adb shell后面的各种命令
如何在python脚本里面连续执行adb shell后面的各种命令 adb shell "cd /data/local && mkdir tmp" adb shel ...
- [钉钉通知系列]Jenkins发布后自动通知
一.前言 最近使用Jenkins进行自动化部署,但是发布署后,并没有相应的通知,虽然有邮件发送通知,但是发现邮件会受限于大家接受的设置,导致不能及时看到相关的发布内容.由于之前有用Gitlab推送消息 ...
- StrutsPreparedAndExcuteFilter与Interceptor
filter详解 Filter种类(可以进行那些预处理) 用户授权的Filter:Filter负责检查用户请求,对用户访问权限的控制 日志Filter:详细记录某些特殊的用户请求. 负责解码的Filt ...
- new/delete 与 malloc/free的区别
一.概述 在C++中,申请动态内存与释放动态内存用new/delete 与 malloc/free都可以,而且他们的存储方式相同,new/malloc申请的动态内存位于堆中,无法被操作系统自动 ...
- 玩玩微信公众号Java版之一:配置微信公众平台服务器信息
在进行微信公众平台开发前,前先做好准备工作,好了以后,我们可以开始啦! 第一.准备好服务端接口 定义一个http服务接口,主要分为如下几步: 1.创建一个servlet类,用来接收请求: ...
- 浅谈 EF CORE 迁移和实例化的几种方式
出于学习和测试的简单需要,使用 Console 来作为 EF CORE 的承载程序是最合适不过的.今天笔者就将平时的几种使用方式总结成文,以供参考,同时也是给本人一个温故知新的机会.因为没有一个完整的 ...
- 【SignalR学习系列】4. SignalR广播程序
创建项目 创建一个空的 Web 项目,并在 Nuget 里面添加 SignalR,jQuery UI 包,添加以后项目里包含了 jQuery,jQuery.UI ,和 SignalR 的脚本. 服务端 ...
- margin用的时候常见问题
margin1. 在同一个方向布局 同时设置左右margin的时候间距是两者之和 同时设置上下margin的时候间距是较大的那个,大者为尊2. 拖拽父级 ...