每個(gè)項(xiàng)目都會(huì)有權(quán)限管理系統(tǒng)
無(wú)論你是一個(gè)簡(jiǎn)單的企業(yè)站,還是一個(gè)復(fù)雜到爆的平臺(tái)級(jí)項(xiàng)目,都會(huì)涉及到用戶登錄、權(quán)限管理這些必不可少的業(yè)務(wù)邏輯。有人說(shuō),企業(yè)站需要什么權(quán)限管理阿?那行吧,你那可能叫靜態(tài)頁(yè)面,就算這樣,但你肯定也會(huì)有后臺(tái)管理及登錄功能。
每個(gè)項(xiàng)目中都會(huì)有這些幾乎一樣的業(yè)務(wù)邏輯,我們能不能把他們做成通用的系統(tǒng)呢?
AOP 實(shí)現(xiàn)用戶權(quán)限驗(yàn)證
AOP 在實(shí)際項(xiàng)目中運(yùn)用的場(chǎng)景主要有權(quán)限管理(Authority Management)、事務(wù)管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和調(diào)試管理(Debugging)等。
所以,權(quán)限驗(yàn)證正好我們可以使用 AOP 來(lái)直接實(shí)現(xiàn)。具體你項(xiàng)目中權(quán)限怎么管理,管理的粒度是什么級(jí)別這些完全取決于項(xiàng)目需要,這里完全不做任何的討論。
先說(shuō)思路:利用自定義注解及攔截器來(lái)在你需要的時(shí)候,進(jìn)行你需要的一些權(quán)限認(rèn)證。這里依然涉及到的有enum(枚舉)
、annotation(自定義注解)
及攔截器相關(guān)知識(shí),廢話不多說(shuō),直接開(kāi)寫(xiě)代碼。
開(kāi)始擼一下代碼
**一、建立AuthorityType.java
枚舉類(lèi)
1
2
3
4
5
6
7
8
9
10
11
|
public enum AuthorityType { // 登錄和權(quán)限都驗(yàn)證 默認(rèn) Validate, // 不驗(yàn)證 NoValidate, // 不驗(yàn)證權(quán)限 NoAuthority; } |
這個(gè)枚舉類(lèi)的作用,依然是使自定義注解用起來(lái)爽到還想要。
二、新建Authority.java
自定義注解類(lèi)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import java.lang.annotation.Documented; 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) @Documented public @interface Authority { // 默認(rèn)驗(yàn)證 AuthorityType value() default AuthorityType.Validate; } |
三、再建一個(gè)AuthorityAnnotationInterceptor.java
類(lèi)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
/** * 權(quán)限認(rèn)證攔截器 * */ public class AuthorityAnnotationInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { HandlerMethod hm = (HandlerMethod) handler; Class<?> clazz = hm.getBeanType(); Method m = hm.getMethod(); try { if (clazz != null && m != null ) { boolean isClzAnnotation = clazz.isAnnotationPresent(Authority. class ); boolean isMethondAnnotation = m.isAnnotationPresent(Authority. class ); Authority authority = null ; // 如果方法和類(lèi)聲明中同時(shí)存在這個(gè)注解,那么方法中的會(huì)覆蓋類(lèi)中的設(shè)定。 if (isMethondAnnotation) { authority = m.getAnnotation(Authority. class ); } else if (isClzAnnotation) { authority = clazz.getAnnotation(Authority. class ); } int code = - 1 ; String msg = "" ; if (authority != null ) { if (AuthorityType.NoValidate == authority.value()) { // 標(biāo)記為不驗(yàn)證,放行 return true ; } else if (AuthorityType.NoAuthority == authority.value()) { // 不驗(yàn)證權(quán)限,驗(yàn)證是否登錄 // TODO: return true ; } else { // 驗(yàn)證登錄及權(quán)限 // TODO: code = 1 ; msg = "驗(yàn)證成功!" ; return true ; } } // //跳轉(zhuǎn) // String url = ""; // response.getWriter().write("<script>top.location.href='" // + url + "'</script>"); // return false; // 未通過(guò)驗(yàn)證,返回提示json Map<String, Object> responseMap = new HashMap<String, Object>(); responseMap.put( "code" , code); responseMap.put( "msg" , msg); responseMap.put( "params" , "" ); responseMap.put( "rows" , "" ); String json = new Gson().toJson(responseMap); response.setCharacterEncoding( "UTF-8" ); response.setContentType( "application/json; charset=utf-8" ); response.getWriter().write(json); return false ; } } catch (Exception e) { } } return false ; } } |
這個(gè)類(lèi)的目的就是在打過(guò)Authority
標(biāo)簽的方法及類(lèi)上,進(jìn)行權(quán)限認(rèn)證。我這里分了三種類(lèi)型:全部驗(yàn)證、只驗(yàn)證登錄、不驗(yàn)證用來(lái)滿足我們的業(yè)務(wù)需求。
這里的返回值可以是 JSON 串,也可以是跳轉(zhuǎn)到相應(yīng)的頁(yè)面,來(lái)實(shí)現(xiàn)你想要的效果。
四、配置攔截器
1
2
3
4
5
6
7
|
< mvc:interceptors > <!-- 權(quán)限認(rèn)證攔截器 --> < mvc:interceptor > < mvc:mapping path = "/**" /> < bean class = "cn.mayongfa.interceptor.AuthorityAnnotationInterceptor" ></ bean > </ mvc:interceptor > </ mvc:interceptors > |
在/WebContent/WEB-INF/springMVC-servlet.xml
文件下的<mvc:interceptors>
節(jié)點(diǎn)配置就行,這里可以配置具體要攔截的 Url。
到這里就完成了權(quán)限驗(yàn)證的工作了,如何使用呢?
使用就非常簡(jiǎn)單
因?yàn)槲覀兊臄r截器配置,然后我們?cè)谧远x注解的默認(rèn)是驗(yàn)證,所以,我們只需要在類(lèi)名及方法名上打標(biāo)簽就可以。
當(dāng)然,你完全是可以在攔截器中設(shè)置默認(rèn)就驗(yàn)證所有請(qǐng)求的,接著設(shè)置不驗(yàn)證的請(qǐng)求。
文章的具體的案例地址:SpringDemo.rar
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/mafly/p/spring_authority.html