shiro安全框架

shiro安全框架

搭建:
pom.xml 导入 服务启动index超出范围,jar包出错,使用maven test

org.apache.shiro
shiro-spring
1.4.0



org.apache.shiro
shiro-ehcache
1.4.0



org.apache.shiro
shiro-core
1.4.0

web.xml 过滤代理

shiroFilter
org.springframework.web.filter.DelegatingFilterProxy


shiroFilter
/*

applicationcontext.xml bean设置
anon:例子/admins/=anon 没有参数,表示可以匿名使用。
authc:例如/admins/user/
=authc表示需要认证(登录)才能使用,FormAuthenticationFilter是表单认证,没有参数
roles:例子/admins/user/=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/=roles[“admin,guest”],每个参数通过才算通过,相当于hasAllRoles()方法。
perms:例子/admins/user/=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/=perms[“user:add:,user:modify:”],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。
rest:例子/admins/user/=rest[user],根据请求的方法,相当于/admins/user/=perms[user:method] ,其中method为post,get,delete等。
port:例子/admins/user/=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString是你访问的url里的?后面的参数。
authcBasic:例如/admins/user/
=authcBasic没有参数表示httpBasic认证
ssl:例子/admins/user/=ssl没有参数,表示安全的url请求,协议为https
user:例如/admins/user/
=user没有参数表示必须存在用户, 身份认证通过或通过记住我认证通过的可以访问,当登入操作时不做检查
注:
anon,authcBasic,auchc,user是认证过滤器,
perms,roles,ssl,rest,port是授权过滤器
anno,任何人都可以访问;
authc:必须是登录之后才能进行访问,不包括remember me;
user:登录用户才可以访问,包含remember me;
perms:指定过滤规则,这个一般是扩展使用,不会使用原生的










/callback=anon
/=authc
/=anon



Realm
加入扫描//(两个)
@Component
public class UserRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//获取权限权限列表
Iterator iter = principals.fromRealm(getName()).iterator();
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addStringPermissions(Arrays.asList(“q1”,“q2”,“q3”)); //数据库查询你结果
return info;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
// 进行登陆操作
try {
UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
String name = token.getUsername();
String password = new String(token.getPassword());
if (true) { //改为是否用户名密码正确
return new SimpleAuthenticationInfo(name,password, getName());
}
return null;
} catch (Exception e) {
return null;
}
}
}
登录验证:
Subject sub = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username,password);
sub.login(token);
权限检验:
xml属性:


/callback=anon
/=authc
/=anon


anotation设定检验:
@RequiresAuthentication
验证用户是否登录,等同于方法subject.isAuthenticated() 结果为true时。
@RequiresUser
验证用户是否被记忆,user有两种含义:
一种是成功登录的(subject.isAuthenticated() 结果为true);
另外一种是被记忆的(subject.isRemembered()结果为true)。
@RequiresGuest
验证是否是一个guest的请求,与@RequiresUser完全相反。
换言之,RequiresUser == !RequiresGuest。
此时subject.getPrincipal() 结果为null.
@RequiresRoles
例如:@RequiresRoles(“aRoleName”);
void someMethod();
如果subject中有aRoleName角色才可以访问方法someMethod。如果没有这个权限则会抛出异常AuthorizationException。
@RequiresPermissions
例如: @RequiresPermissions({“file:read”, “write:aFile.txt”} )
void someMethod();
要求subject中必须同时含有file:read和write:aFile.txt的权限才能执行方法someMethod()
tag标签:
shiro:guest
游客访问
</shiro:guest>

user 标签:用户已经通过认证\记住我 登录后显示响应的内容
shiro:user
欢迎[shiro:principal/]登录 退出
</shiro:user>

authenticated标签:用户身份验证通过,即 Subjec.login 登录成功 不是记住我登录的
shiro:authenticted
用户[shiro:principal/] 已身份验证通过
</shiro:authenticted>

notAuthenticated标签:用户未进行身份验证,即没有调用Subject.login进行登录,包括"记住我"也属于未进行身份验证
shiro:notAuthenticated
未身份验证(包括"记住我")
</shiro:notAuthenticated>

principal 标签:显示用户身份信息,默认调用
Subjec.getPrincipal()获取,即Primary Principal
<shiro:principal property = “username”/>

hasRole标签:如果当前Subject有角色将显示body体内的内容
<shiro:hashRole name = “admin”>
用户[shiro:principal/]拥有角色admin
</shiro:hashRole>

hasAnyRoles标签:如果Subject有任意一个角色(或的关系)将显示body体里的内容
<shiro:hasAnyRoles name = “admin,user”>
用户[shiro:pricipal/]拥有角色admin 或者 user
</shiro:hasAnyRoles>

lacksRole:如果当前 Subjec没有角色将显示body体内的内容
<shiro:lacksRole name = “admin”>
用户[shiro:pricipal/]没有角色admin
</shiro:lacksRole>

hashPermission:如果当前Subject有权限将显示body体内容
<shiro:hashPermission name = “user:create”>
用户[shiro:pricipal/] 拥有权限user:create
</shiro:hashPermission>

lacksPermission:如果当前Subject没有权限将显示body体内容
<shiro:lacksPermission name = “org:create”>
用户[shiro:pricipal/] 没有权限org:create
</shiro:lacksPermission>
指定权限:
Subject currentUser = SecurityUtils.getSubject();
if (currentUser.hasRole(“admin”)) {
logger.info("-----------啊啊啊啊–admin---------");
}
if (currentUser.hasRole(“user”)) {
logger.info("-----------user---------");
}

补充:

上一篇:rook ceph 安装采坑


下一篇:2020-02-26