1. 程式人生 > >springmvc簡單實現許可權控制

springmvc簡單實現許可權控制

用過了Spring Security,一般都不會採用這種簡單的自定義方式.自定義當然靈活自由,越要完善,也就意味做的工作越多.使用框架,別人考慮得相對周到,比如spring security的防止攻擊就有session fixation, clickjacking, cross site request forgery.以下的簡單實現的許可權控制雖然可以去實現這樣的功能,但就沒必要了.當然這個模型是包含認證和授權.

1.寫一個自定義註解(功能類似於spring security的@PreAuthorize)

package org.exam.auth;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Auth {
	String value() default "";
	String name() default "";
}
2.寫一個攔截器.
package org.exam.auth;
import org.springframework.http.HttpStatus;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Set;
public class AuthInterceptor extends HandlerInterceptorAdapter {
	public static final String SESSION_USERID = "kUSERID";
	public static final String SESSION_AUTHS = "kAUTHS";
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		boolean flag = true;
		if (handler instanceof HandlerMethod) {
			Auth auth = ((HandlerMethod) handler).getMethod().getAnnotation(Auth.class);
			if (auth != null) {// 有許可權控制的就要檢查
				if (request.getSession().getAttribute(SESSION_USERID) == null) {// 沒登入就要求登入
					response.setStatus(HttpStatus.FORBIDDEN.value());
					response.setContentType("text/html; charset=UTF-8");
					PrintWriter out=response.getWriter();
					out.write("{\"type\":\"nosignin\",\"msg\":\"請您先登入!\"}");
					out.flush();
					out.close();
					flag = false;
				} else {// 登入了檢查,方法上只是@Auth,表示只要求登入就能通過
[email protected]
("authority")這型別,驗證使用者許可權 if (!"".equals(auth.value())) { Set<String> auths = (Set<String>) request.getSession().getAttribute(SESSION_AUTHS); if (!auths.contains(auth.value())) {// 提示使用者沒許可權 response.setStatus(HttpStatus.FORBIDDEN.value()); response.setContentType("text/html; charset=UTF-8"); PrintWriter out=response.getWriter(); out.write("{\"type\":\"noauth\",\"msg\":\"您沒有"+auth.name()+"許可權!\"}"); out.flush(); out.close(); flag = false; } } } } } return flag; } }
處理controller的@RequestMapping方法(這裡的處理直接通過response處理,spring security先拋異常,然後再統一處理異常):
a.如果這個方法沒有使用Auth註解,會認為沒有作許可權控制,任何人可以訪問.
b.如果這個方法只標註了@Auth,如果使用者沒登入,會返回一個403,並提示使用者登入.
c.如果這個方法標註了具體需要某種許可權,如@Auth("authority"),就要求使用者必須有這種許可權,否則返回403,並提示使用者沒有許可權,這裡相當於實現授權,並且授權之前先認證.


3.讓攔截器起作用.重寫org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter#addInterceptors方法
@Configuration
@ComponentScan(basePackages={"org.exam.web"})
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter{
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new AuthInterceptor());
	}
	//其它略...
}
4.使用者登入(只做了一個模擬登入)和具體使用,剩下的就可以測試了.
@Controller
@RequestMapping("/user")
public class UserController {
	@RequestMapping("/login")
	@ResponseBody
	public boolean login(HttpSession session,User user){
		boolean result=false;
		//模擬從資料庫查出存在這樣的使用者
		Long userId=user.getId();
		if(userId!=null&&userId>0){
			session.setAttribute(AuthInterceptor.SESSION_USERID, userId);
			session.setAttribute(AuthInterceptor.SESSION_AUTHS, new HashSet<String>(Arrays.asList("user_list", "user_query", "user_save")));
			result=true;
		}
		return result;
	}
	@Auth("user_queryXXXX")
	@RequestMapping("/query")
	@ResponseBody
	public String query(){
		System.out.println("query");
		return getClass().toString();
	}
	@Auth("user_list")
	@RequestMapping("/list")
	@ResponseBody
	public String list(){
		System.out.println("list");
		return getClass().toString();
	}
	@Auth("user_save")
	@RequestMapping("/add")
	public String add(User user){
		System.out.println("add:"+user);
		return "user/add";
	}
}

相關推薦

springmvc簡單實現許可權控制

用過了Spring Security,一般都不會採用這種簡單的自定義方式.自定義當然靈活自由,越要完善,也就意味做的工作越多.使用框架,別人考慮得相對周到,比如spring security的防止攻擊就有session

如何自定義註解實現簡單許可權控制

為什麼需要許可權控制? 當一個系統建成之後,需要適當的做一些許可權控制,使得某些非法使用者不能隨意更改系統,而允許某些特權使用者可以作業系統. 一般系統如何實現許可權控制? 一般系統如果許可權較為複雜,可能需要藉助一些許可權控制框架,例如shiro來實現許

springmvc整合shiro許可權控制

一、什麼是Shiro   Apache Shiro是一個強大易用的Java安全框架,提供了認證、授權、加密和會話管理等功能:  認證 - 使用者身份識別,常被稱為使用者“登入”; 授權 - 訪問控制; 密碼加密 - 保護或隱藏資料防止被偷窺; 會話

Spring Boot 整合 Shiro實現許可權控制,親測可用,附帶sql

前提: 本文主要講解Spring Boot 與 Shiro的整合 與許可權控制的實現方式(主要以程式碼實現功能為主),主要用到的技術Spring Boot+Shiro+Jpa(通過Maven構建),並不會涉及到Shiro框架的原始碼分析 如果有想要學習Shiro框架的小夥伴可以去http://shiro.

Shiro 整合SpringMVC 並且實現許可權管理,登入和登出

Apache Shiro是Java的一個安全框架。目前,使用Apache Shiro的人越來越多,因為它相當簡單,對比Spring Security,可能沒有Spring Security做的功能強大,但是在實際工作時可能並不需要那麼複雜的東西,所以使用小而簡單

Shiro——實現許可權控制demo思路(包含自定義標籤hasAnyPermission)

在很多系統中需要使用許可權控制,來控制不同角色的人訪問不同的資源。表達能力不好,不喜勿噴! 環境:eclipse4.5.2+oracle11g+hibernate4+spring4+shiro+jboss 原始碼(工程)+ 資料表sql(包含初始化資料)+hibernat

springMVC學習心得及手寫springMVC簡單實現

springMVC學習心得及手寫springMVC簡單實現 Spring 是一個企業級開發框架,為解決企業級專案開發過於複雜而建立的,框架的主要優勢之一就是分層架構,允許開發者自主選擇元件。 Spring 的兩大核心機制是 IoC(控制反轉)和 AOP(面向切面程式設計),從開發的角度

springMVC+velocity做許可權控制 控制到按鈕!

1.spring攔截器配置 <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/privileges/*"/> <mvc:mapping

Taurus.MVC 2.2.3.4 :WebAPI 實現許可權控制認證(及功能增強說明)

前言: 前兩天,當我還在老家收拾行旅,準備回廣州,為IT連的創業再戰365天時, 有網友扣上問:Taurus.MVC中如何實現認證和許可權控制,最好能做個小例子。 我一不小心回了句:等回廣州我再寫篇文章...... 然後,今天就來補文章了〜〜〜〜 Taurus.MVC Nuget 更新: 寫文之前

第7篇:ui-router登入檢查實現許可權控制

做專案時用到了前端登入檢查實現使用者許可權控制,在angularJS外掛中用到了ui-router,可以利用本地儲存實現對登入狀態的監聽,實現如下: 1)登入成功,將登入資訊寫入本地儲存: $.ajax({ type: 'POST',

在Spring Boot中使用Spring Security實現許可權控制

Spring Boot框架我們前面已經介紹了很多了,相信看了前面的部落格的小夥伴對Spring Boot應該有一個大致的瞭解了吧,如果有小夥伴對Spring Boot尚不熟悉,可以先移步這裡從SpringMVC到Spring Boot,老司機請略過。OK,那我們

springboot整合shiro 實現許可權控制

shiro apache shiro 是一個輕量級的身份驗證與授權框架,與spring security 相比較,簡單易用,靈活性高,springboot本身是提供了對security的支援,畢竟是自家的東西。springboot暫時沒有整合shiro,這得自

SpringMVC簡單實現國際化/多語言

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www

Spring專案整合ShiroFilter簡單實現許可權管理

Shiros是我們開發中常用的用來實現許可權控制的一種工具包,它主要有認證、授權、加密、會話管理、與Web整合、快取等功能。我是從事javaweb工作的,我就經常遇到需要實現許可權控制的專案,之前我們都是靠查詢資料獲取列表拼接展示的,還有的是及時的判斷許可權的問

ASP.net Menu控制元件動態新增選單項實現許可權控制

      對於動態選單生成,在很多具有許可權控制的專案中非常常見。最近遇到一個需求就是不同使用者具有不同許可權,該許可權是頁面級的,所以需要根據不同使用者的許可權情況動態生成選單項。        首先,我把選單項中的內容先儲存在一個XML裡面,在載入模板頁時只需根據查詢

Spring AOP自定義註解實現許可權控制

1.建立註解類,controller控制層使用該註解進行許可權控制使用 import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.R

SpringBoot中使用Spring Security實現許可權控制

Spring Security,這是一個專門針對基於Spring的專案的安全框架,它主要是利用了AOP來實現的。以前在Spring框架中使用Spring Security需要我們進行大量的XML配置,但是,Spring Boot針對Spring Security

spring boot註解實現許可權控制

1、自定義註解 Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RoleCheck { String[] roles() default

NODE + JWT + Mongo(簡單實現許可權管理)

文章目錄 JWT簡介 應用 JWT簡介 官方是這樣介紹的: JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and sel

在前後端分離的專案中,後臺使用shiro框架時,怎樣使用它的會話管理系統(session),從而實現許可權控制

在前後端分離的專案中,ajax跨域和儲存使用者資訊是其中的重點和難點。 如果在後臺使用shiro框架來進行許可權控制,就需要用到cookie+session的模式來儲存使用者的資訊。 在前一篇文章《在前後端分離的專案中,ajax跨域請求怎樣附帶cookie》中,我具體寫了怎