-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
12 changed files
with
395 additions
and
11 deletions.
There are no files selected for viewing
83 changes: 83 additions & 0 deletions
83
shiro-study/src/main/java/com/nineya/shiro/config/ManageRealm.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
package com.nineya.shiro.config; | ||
|
||
import com.nineya.shiro.entity.*; | ||
import com.nineya.shiro.service.LoginService; | ||
import com.nineya.shiro.util.UserTokenUtil; | ||
import org.apache.catalina.realm.AuthenticatedUserRealm; | ||
import org.apache.shiro.authc.*; | ||
import org.apache.shiro.authz.AuthorizationInfo; | ||
import org.apache.shiro.authz.SimpleAuthorizationInfo; | ||
import org.apache.shiro.realm.AuthenticatingRealm; | ||
import org.apache.shiro.realm.AuthorizingRealm; | ||
import org.apache.shiro.subject.PrincipalCollection; | ||
import org.springframework.util.StringUtils; | ||
|
||
import javax.annotation.Resource; | ||
import java.util.stream.Collectors; | ||
|
||
/** | ||
* 自定义管理员的 realm | ||
* | ||
* @author 殇雪话诀别 | ||
* 2021/2/15 | ||
*/ | ||
public class ManageRealm extends AuthorizingRealm { | ||
@Resource | ||
private LoginService loginService; | ||
@Resource | ||
private UserTokenUtil tokenUtil; | ||
|
||
@Override | ||
public boolean supports(AuthenticationToken token) { | ||
return token instanceof JwtToken; | ||
} | ||
|
||
/** | ||
* 授权,在认证之后执行 | ||
* @param principals | ||
* @return | ||
*/ | ||
@Override | ||
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { | ||
System.out.println(this.getClass().getName()); | ||
String token = (String) principals.getPrimaryPrincipal(); | ||
String name = tokenUtil.getUserName(token); | ||
Manage manage = loginService.getManageById(Long.parseLong(name)); | ||
if (manage == null) { | ||
return null; | ||
} | ||
// 添加角色和权限 | ||
SimpleAuthorizationInfo simpleAuthenticationInfo = new SimpleAuthorizationInfo(); | ||
for (Role role : manage.getRoles()) { | ||
// 添加角色 | ||
simpleAuthenticationInfo.addRole(role.getRoleName()); | ||
// 添加权限 | ||
simpleAuthenticationInfo.addStringPermissions(role.getPermissions().stream() | ||
.map(Permissions::getPermissionsName).collect(Collectors.toSet())); | ||
} | ||
return simpleAuthenticationInfo; | ||
} | ||
|
||
/** | ||
* 认证 | ||
* @param token | ||
* @return | ||
* @throws AuthenticationException | ||
*/ | ||
@Override | ||
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { | ||
System.out.println(this.getClass().getName()); | ||
if (StringUtils.isEmpty(token.getPrincipal())) { | ||
return null; | ||
} | ||
String name = tokenUtil.getUserName((String) token.getPrincipal()); | ||
Manage manage = loginService.getManageById(Long.parseLong(name)); | ||
if (manage == null) { | ||
return null; | ||
} | ||
// 第一个参数是主体,将会在授权时封装成PrincipalCollection.getPrimaryPrincipal()进行使用,所以必须将jwt内容传回 | ||
// 第二个参数是认证信息,即密码,为后面验证可以通过,需要和token中的内容一样 | ||
// 第三个参数是领域名称 | ||
return new SimpleAuthenticationInfo(token.getPrincipal(), token.getCredentials(), getName()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
31 changes: 31 additions & 0 deletions
31
shiro-study/src/main/java/com/nineya/shiro/config/StudyModularRealmAuthenticator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package com.nineya.shiro.config; | ||
|
||
import com.nineya.shiro.entity.JwtToken; | ||
import org.apache.shiro.authc.AuthenticationException; | ||
import org.apache.shiro.authc.AuthenticationInfo; | ||
import org.apache.shiro.authc.AuthenticationToken; | ||
import org.apache.shiro.authc.pam.ModularRealmAuthenticator; | ||
import org.apache.shiro.realm.Realm; | ||
|
||
import java.util.Collection; | ||
|
||
/** | ||
* @author 殇雪话诀别 | ||
* 2021/2/17 | ||
*/ | ||
public class StudyModularRealmAuthenticator extends ModularRealmAuthenticator { | ||
@Override | ||
protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) throws AuthenticationException { | ||
// 判断 Realm 是否为空 | ||
assertRealmsConfigured(); | ||
Collection<Realm> realms = getRealms(); | ||
JwtToken jwtToken = (JwtToken) authenticationToken; | ||
String loginType = jwtToken.getLoginType().name(); | ||
for (Realm realm : realms) { | ||
if (realm.getName().equals(loginType)) { | ||
return doSingleRealmAuthentication(realm, authenticationToken); | ||
} | ||
} | ||
return null; | ||
} | ||
} |
57 changes: 57 additions & 0 deletions
57
shiro-study/src/main/java/com/nineya/shiro/config/StudyModularRealmAuthorizer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
package com.nineya.shiro.config; | ||
|
||
import org.apache.shiro.authz.Authorizer; | ||
import org.apache.shiro.authz.ModularRealmAuthorizer; | ||
import org.apache.shiro.authz.Permission; | ||
import org.apache.shiro.realm.Realm; | ||
import org.apache.shiro.subject.PrincipalCollection; | ||
|
||
import java.util.Set; | ||
|
||
/** | ||
* @author 殇雪话诀别 | ||
* 2021/2/18 | ||
*/ | ||
public class StudyModularRealmAuthorizer extends ModularRealmAuthorizer { | ||
@Override | ||
public boolean isPermitted(PrincipalCollection principals, String permission) { | ||
assertRealmsConfigured(); | ||
Set<String> realmNames = principals.getRealmNames(); | ||
for (Realm realm : getRealms()) { | ||
if (!(realm instanceof Authorizer)) continue; | ||
// 仅比较 realmName 对应得上的 realm | ||
if (realmNames.contains(realm.getName())) { | ||
return ((Authorizer) realm).isPermitted(principals, permission); | ||
} | ||
} | ||
return false; | ||
} | ||
|
||
@Override | ||
public boolean isPermitted(PrincipalCollection principals, Permission permission) { | ||
assertRealmsConfigured(); | ||
Set<String> realmNames = principals.getRealmNames(); | ||
for (Realm realm : getRealms()) { | ||
if (!(realm instanceof Authorizer)) continue; | ||
// 仅比较 realmName 对应得上的 realm | ||
if (realmNames.contains(realm.getName())) { | ||
return ((Authorizer) realm).isPermitted(principals, permission); | ||
} | ||
} | ||
return false; | ||
} | ||
|
||
@Override | ||
public boolean hasRole(PrincipalCollection principals, String roleIdentifier) { | ||
assertRealmsConfigured(); | ||
Set<String> realmNames = principals.getRealmNames(); | ||
for (Realm realm : getRealms()) { | ||
if (!(realm instanceof Authorizer)) continue; | ||
// 仅比较 realmName 对应得上的 realm | ||
if (realmNames.contains(realm.getName())) { | ||
return ((Authorizer) realm).hasRole(principals, roleIdentifier); | ||
} | ||
} | ||
return false; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.