导航:首页 > 净水问答 > shiro过滤http请求

shiro过滤http请求

发布时间:2024-07-09 00:50:06

A. ssm框架访问控制应该怎么做

这个就在在人员表了添加一个身份的字段 user_rank ,用这个来控制。用户登录到时候就会用登录信息,把这个 user_rank 字段带出来,在页面或者链接时候加上判断,哈这是简单的,看下官方的。

shiro安全框架是目前为止作为登录注册最常用的框架,因为它十分的强大简单,提供了认证、授权、加密和会话管理等功能 。

shiro能做什么?

认证:验证用户的身份

授权:对用户执行访问控制:判断用户是否被允许做某事

会话管理:在任何环境下使用 Session API,即使没有 Web 或EJB 容器。

加密:以更简洁易用的方式使用加密功能,保护或隐藏数据防止被偷窥

Realms:聚集一个或多个用户安全数据的数据源

单点登录(SSO)功能。

为没有关联到登录的用户启用 "Remember Me“ 服务

Shiro 的四大核心部分

Authentication(身份验证):简称为“登录”,即证明用户是谁。

Authorization(授权):访问控制的过程,即决定是否有权限去访问受保护的资源。

Session Management(会话管理):管理用户特定的会话,即使在非 Web 或 EJB 应用程序。

Cryptography(加密):通过使用加密算法保持数据安全

shiro的三个核心组件:

Subject:正与系统进行交互的人,或某一个第三方服务。所有 Subject 实例都被绑定到(且这是必须的)一个SecurityManager 上。

SecurityManager:Shiro 架构的心脏,用来协调内部各安全组件,管理内部组件实例,并通过它来提供安全管理的各种服务。当 Shiro 与一个 Subject 进行交互时,实质上是幕后的 SecurityManager 处理所有繁重的 Subject 安全操作。

Realms:本质上是一个特定安全的 DAO。当配置 Shiro 时,必须指定至少一个 Realm 用来进行身份验证和/或授权。Shiro 提供了多种可用此尘渣的 Realms 来获取安全相关的数据。如关系数据库(JDBC),INI 及属性兄段文件等。可以定义自己 Realm 实现来代表自定义的数据源。

shiro整合SSM框架:

1.加入 jar 包:以下jar包自行网络下载

准备好了,接下来要写Realm方法了,新建shiro包,在包下新建MyRealm.java文件继承AuthorizingRealm

package shiro;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.authc.credential.HashedCredentialsMatcher;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.authz.SimpleAuthorizationInfo;import org.apache.shiro.crypto.hash.Md5Hash;import org.apache.shiro.crypto.hash.SimpleHash;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import org.apache.shiro.util.ByteSource;import org.springframework.beans.factory.annotation.Autowired;import bean.user;import .user;public class MyRealm extends AuthorizingRealm {
@Autowired private user user;
String pass; /**
* 授权:
*
*/
@Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
Object principal = principalCollection.getPrimaryPrincipal();//获取登录的用户名
if("admin".equals(principal)){ //两个if根据判断赋予登录用户权限
info.addRole("admin");
} if("user".equals(principal)){
info.addRole("list");
}

info.addRole("user");
return info;
} /*
* 用户验证
*
*/
@Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//1. token 中获取登录的 username! 注意不需要获取password.
Object principal = token.getPrincipal();
//2. 利用 username 查询数据库得到用户的信息.
user user=user.findbyname((String) principal); if(user!=null){
pass=user.getPass();
}
String credentials = pass; //3.设置盐值 ,(加密的调料,让加密出来的东西更具安全性,一般是通过数据库查询出来的。 简单的说,就是把密码根据特定的东西而进行动态加密,如果别人不知道你的盐值,就解不出你的密码)
String source = "abcdefg";
ByteSource credentialsSalt = new Md5Hash(source);

//当前 Realm 的name
String realmName = getName(); //返回值实例化
SimpleAuthenticationInfo info =
new SimpleAuthenticationInfo(principal, credentials,
credentialsSalt, realmName);
return info;
} //init-method 配置.
public void setCredentialMatcher(){
HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
credentialsMatcher.setHashAlgorithmName("MD5");//MD5算法加密
credentialsMatcher.setHashIterations(1024);//1024次循环加密
setCredentialsMatcher(credentialsMatcher);
}

//用来测试的算出密码password盐值加密后的结果,下面方法用于新增用户添加到数据库操作的,我这里就直接用main获得,直接数据库添加了,省时间
public static void main(String[] args) {
String saltSource = "abcdef";
String hashAlgorithmName = "MD5";
String credentials = "passwor";
Object salt = new Md5Hash(saltSource); int hashIterations = 1024;
Object result = new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations);
System.out.println(result);
}

}

好了,接下来我们写一个简单的action来通过shiro登录验证。

//登录认证
@RequestMapping("/shiro-login") public String login(@RequestParam("username") String username,
@RequestParam("password") String password){
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try { //执行认证操作. subject.login(token);
}catch (AuthenticationException ae) {
System.out.println("登陆失败: " + ae.getMessage()); return "/index";
}
return "/shiro-success";
}

//温馨提示:记得在注册中密码存入数据库前也记得加密哦,提供一个utils方法//进行shiro加密,返回加密后的结果public static String md5(String pass){
String saltSource = "blog";
String hashAlgorithmName = "MD5";
Object salt = new Md5Hash(saltSource);int hashIterations = 1024;
Object result = new SimpleHash(hashAlgorithmName, pass, salt, hashIterations);
String password = result.toString();return password;
}

好了,shiro登录验证到这里完了

B. Shiro中的filter

DefaultFilter

shiro中提供的默认filter

FilterChainManager

通过配置创建对应的filterChain

Shiro通过此配置可初始化FilterChainManager中的filterChain,结构为 url ->filter列表

SpringShiroFilter

入口filter,拦截所有请求,通过请求的url匹配到对应的filterChain,然后通过Chain对请求进行,认证或者授权的处理

OncePerRequestFilter

OncePerRequestFilter 用于防止多次执行 Filter;也就是说一次请求只会走一次拦截器链;

另外提供 enabled 属性,表示是否开启该拦截器实例

实现了 doFilter 方法,提供了抽象方法 doFilterInternal

在doFilter中验证当前的Filter有没有执行过,如果已经执行过一次或者当前filter被禁用,则直接执行下一个Filter。如果没有执行过则执行 doFilterInternal 方法

AbstractShiroFilter

创建Subject,绑定subject到当前线程,根据url获取filterChain并执行filterChain

通过请求的url来匹配FilterChainManager中的FilterChain,这个方法会返回一个 ProxiedFilterChain

ProxiedFilterChain

存储了tomcat的Filter 和shiro内部的filter

shiro内部的过滤器执行完后会切换到tomcat的过滤器继续执行

默认filter

除了LogoutFilter,其他都继承了AdviceFilter

AdviceFilter

AdviceFilter 提供了 AOP 风格的支持,类似于 SpringMVC 中的 Interceptor:

权限验证在preHandle中实现

PathMatchingFilter

PathMatchingFilter 提供了基于 Ant 风格的请求路径匹配功能及拦截器参数解析的功能,如

/admin roles[admin,user] ”自动根据 “,” 分割,解析成 /admin -> [admin,user] 存入 appliedPaths

实现了 preHandle 方法,通过请求的url匹配url对应的权限,解析权限串 调用子类的 onPreHandle 对权限进行处理

AnonymousFilter

提供匿名访问功能,实现了 onPreHandle 直接返回true,所以配置 anon 的url任何人都可以访问

AccessControlFilter

提供了资源访问控制的基础功能

实现了 onPreHandle ,这里拆分出了

isAccessAllowed (是否允许访问)和 onAccessDenied (访问被拒绝时)这两个方法供子类实现

AuthenticationFilter

实现了 isAccessAllowed 方法,验证用户是否已经登录,没有登录将被拒绝

FormAuthenticationFilter

继承自 AuthenticationFilter 只有用户登录过后才能通过

实现了 onAccessDenied 方法,如果请求的地址是登录地址,这里会尝试自动登录,否则跳转到登录页面

BasicHttpAuthenticationFilter

提供了基于 HttpBasic认证的方式

AuthorizationFilter

实现了 onAccessDenied 方法,如果没有认证通过,则跳转到登录或者认证失败的页面

对用户所访问资源的权限进行认证

HttpMethodPermissionFilter

将HTTP请求的方法(例如GET、POST等)转换为相应的动作并构造一个相应的权限

如get 被转换为 read,put 转换为 update,post转换为create等

权限配置:/users perms[users]

请求: get /users

将会验证 用户是否拥有users:read权限

RolesAuthorizationFilter

验证用户是否用对对应的角色

UserFilter

实现了 isAccessAllowed onAccessDenied 方法,验证用户是否登录过,如果验证未通过则跳转到登录页面

C. postman娴嬭瘯鐧诲綍shiro

springboot椤圭洰浣跨敤浜嗚掕壊鏉冮檺shiro绠$悊锛屾垜瑕佹祴璇曞叾瀹冪殑鎺ュ彛浣嗘槸闇瑕佺櫥褰曟垚鍔熷悗鎵嶈兘娴嬭瘯锛岃В鍐宠繖涓闂棰樻湁涓ょ嶆柟娉曘

1.postman鐩存帴杈撳叆鐢ㄦ埛鍚嶅拰瀵嗙爜鐧诲綍鎴愬姛鍚庯紝灏卞彲浠ヨ繘琛屽叾瀹冪殑鎺ュ彛娴嬭瘯銆

2. 浣跨敤swagger鍏堢櫥褰曟垚鍔熷悗锛屽氨鍙浠ユ祴璇曞叾瀹冪殑鎺ュ彛浜嗐

涓锛宲ostman

浜屻乻wagger

springboot闆嗘垚swagger鍚庤块棶URL

http://localhost:8080/swagger-ui.html

@Configuration

@EnableSwagger2

public class SwaggerConfig {

    @Bean

    public Docket api() {

        return new Docket(DocumentationType.SWAGGER_2)

                .apiInfo(apiInfo())

                .select()

                .apis(RequestHandlerSelectors.basePackage("com..controller")) //鑷宸辩殑鎺у埗鍣ㄥ寘鍚嶈矾寰

                .paths(PathSelectors.any())

                .build();

    }

    private ApiInfo apiInfo() {

        return new ApiInfoBuilder()

                .title("涓栫晫 API鏂囨。")

                .description("涓栫晫 鎿嶄綔鏂囨。")

                //鏈嶅姟鏉℃剧綉鍧

                .termsOfServiceUrl("http://www..com/")

                .version("1.0")

                .contact(new Contact("绁栧浗", "http://www..com/", "[email protected]"))

                .build();

    }

}

pom.xml

<dependency>

            <groupId>io.springfox</groupId>

            <artifactId>springfox-swagger2</artifactId>

            <version>2.9.2</version>

        </dependency>

        <dependency>

            <groupId>io.springfox</groupId>

            <artifactId>springfox-swagger-ui</artifactId>

            <version>2.9.2</version>

        </dependency>

D. 銆怱pringBoot銆慡hiro瀹炵幇鏃犵姸鎬佺櫥褰

浣跨敤Shiro瀹炵幇鏈夌姸鎬佺櫥褰曪紝鍗崇敤鎴风櫥褰曠姸鎬佸瓨鍌ㄥ湪鏈嶅姟鍣⊿ession涓锛屼娇鐢⊿hiro瀹炵幇姣旇緝绠鍗曪紝鎴戣繖閲屾殏涓嶈繘琛岃ㄨ恒
鍦ㄤ竴浜涚幆澧冧腑锛屽彲鑳介渶瑕佹妸 Web 搴旂敤鍋氭垚鏃犵姸鎬佺殑锛屽嵆鏈嶅姟鍣ㄧ鏃犵姸鎬侊紝灏辨槸璇存湇鍔″櫒绔涓嶄細瀛樺偍鍍廠ession杩欑嶄笢瑗匡紝鑰屾槸姣忔¤锋眰鏃跺甫涓妕oken涔嬬被鐨勮繘琛岀敤鎴峰垽鏂銆
浣跨敤Shiro瀹炵幇鏃犵姸鎬佺櫥褰曠殑涓昏佹ラゆ湁锛岀佺敤缂撳瓨銆佽剧疆涓嶅垱寤簊ession銆佸叧闂璖ession楠岃瘉銆佸叧闂璖ession瀛樺偍銆佹敞鍏ヨ嚜瀹氫箟鎷︽埅鍣ㄣ佸紑鍚疭hiro鐨勬敞瑙(濡侤RequiresRoles,@RequiresPermissions)绛夈

鑾峰彇token,杩欓噷token鍐欐讳负admin

娣诲姞澧炲垹鏀规煡鎺ュ彛锛屽苟璁剧疆闇瑕佺殑璁块棶鏉冮檺

鍏抽敭鏄璁剧疆涓嶅垱寤篠ession

涓昏佸姛鑳藉氨鏄鎷︽埅http璇锋眰锛岃繘琛岃よ瘉鎺堟潈锛屾敞鎰忎笉瑕佹嫤鎴鐧诲綍璇锋眰

鍦⊿tatelessAuthcFilter鎷︽埅鍣ㄤ腑锛屼細璋冪敤StatelessRealm杩涜宼oken璁よ瘉鍙婄敤鎴锋巿鏉冦
鎴戣繖閲岃剧疆token涓篴dmin鏃舵嫢鏈夊炲垹鏀规煡鐨勬潈闄愩
token涓簎ser鏃讹紝鍙鎷ユ湁鏌ョ殑鏉冮檺銆
鍏朵粬token锛屾棤浠讳綍鏉冮檺銆

涓昏佹槸绂佺敤缂撳瓨銆佷笉鍒涘缓Session銆佸叧闂璖ession楠岃瘉銆佸叧闂璖ession瀛樺偍銆佹敞鍏ラ厤缃鎷︽埅鍣ㄣ佸紑鍚鏉冮檺鏍¢獙娉ㄨВ绛夈

阅读全文

与shiro过滤http请求相关的资料

热点内容
污水泡沫对人体有什么危害 浏览:250
日本排入废水最新消息 浏览:238
社区紧急联系抢修污水外流怎么办 浏览:239
不锈钢蜂蜜化晶过滤器 浏览:278
香港蒸馏水广告古天乐 浏览:489
三聚异氰胺树脂 浏览:396
超滤膜正冲洗 浏览:914
qq音乐播放器音质会提升吗 浏览:761
河北污水排水管多少钱 浏览:37
污水水池要做什么实验 浏览:487
小米净水废水怎么排 浏览:430
什么水不会起水垢 浏览:577
纯净水比普通水有什么好处 浏览:766
温度降低半透膜 浏览:762
我国园区污水处理厂 浏览:753
聚三氟氯乙烯树脂f2314 浏览:803
小米空气净化器怎么用更好 浏览:567
污水令水藻增加 浏览:896
商用净水器怎么盈利 浏览:81
净水机出为啥排废水 浏览:629