Apache Shiro授权登陆
前言
授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等等)。在授权中需要了解几个关键字对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。
一、主体
主体,即访问应用的用户,在Shiro中使用Subject代表该用户。用户只有在授权后才允许访问相应的资源。
资源在应用中用户可以访问的任何东西,比如访问JSP页面、查看 / 编辑某些数据、访问某个业务方法、打印文本等等都是资源。用户只有授权后才能访问。
权限,安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权力。即权限表示在应用中用户能不能访问某个资源,如:访问用户列表页面、查看 / 新增 / 修改 / 删除用户等等。 Shiro支持粗粒度权限(如用户模块所有权限)和细粒度权限(操作某个用户权限,即实例级别的)。
角色代表了操作集合,可以理解为权限的集合,一般情况下我们会赋予用户角色而不是权限,即这样用户可以拥有一组权限,赋予权限时比较方便。典型的如:项目经理、技术总监、CTO、开发工程师等角色,不同角色拥有不同的权限。
二、授权
Shiro支持三种方式授权
(1)编程式
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
//有权限
} else {
//无权限
}
(2)注解式:通过在执行的Java方法上放置相应的注解完成,没有权限将抛出相应的异常;
@RequiresRoles("admin")
public void hello() {
//有权限
}
(3)JSP/GSP标签:在JSP/GSP页面通过相应的标签完成
<shiro:hasRole name="admin">
<!— 有权限 —>
</shiro:hasRole>
1.配置shiro.ini
代码如下(示例):
#对用户信息进行配置
[users]
#用户账户和密码
admin=123456,管理员
bhcdm=11111,客户经理
#对权限信息进行配置,基于角色配置
[roles]
#角色和权限
#配置规则:角色=权限1,权限2。权限字符串可使用通配符配置
管理员=user:*,role:*
#客户经理只能对用户进行列表和详细的查看操作
客户经理=user:list,user:view
其他配置:
@Configuration
public class ShiroConfig {
@Resource
public SysRightService sysRightService;
@Bean
public MyShiroRealm myShiroRealm() {
//自定义Realm
MyShiroRealm shiroRealm = new MyShiroRealm();
return shiroRealm;
}
@Bean
public SecurityManager securityManager() {
//安全管理器SecurityManager
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//注入Realm
securityManager.setRealm(myShiroRealm());
return securityManager;
}
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
//Shiro过滤器:权限验证
ShiroFilterFactoryBean shiroFilterFactory = new ShiroFilterFactoryBean();
//注入SecurityManager
shiroFilterFactory.setSecurityManager(securityManager);
//登录路径
shiroFilterFactory.setLoginUrl("/index");
//登录成功后去到的页面
shiroFilterFactory.setSuccessUrl("/main");
//没有权限跳转到403页面
shiroFilterFactory.setUnauthorizedUrl("/403");
Map<String, String> filterMap = new LinkedHashMap<String, String>();
filterMap.put("/css/**", "anon");
filterMap.put("/fonts/**", "anon");
filterMap.put("/images/**", "anon"