日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

SSM中shiro的基本使用

發(fā)布時(shí)間:2025/6/17 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SSM中shiro的基本使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

shiro

  用以網(wǎng)站的授權(quán)和認(rèn)證

?

配置:

一、shiro基本配置文件

  所用的entity user和role 實(shí)體類

1 @Entity 2 @Table(name="USER_P") 3 @DynamicInsert(value=true) 4 @DynamicUpdate(value=true) 5 public class User extends BaseEntity { 6 @Id 7 @Column(name="USER_ID") 8 @GeneratedValue(generator="system-assigned") 9 @GenericGenerator(name="system-assigned",strategy="assigned") 10 private String id; 11 12 @JsonManagedReference 13 //@ManyToOne(cascade= {CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH},fetch=FetchType.EAGER) 14 @ManyToOne 15 @JoinColumn(name="DEPT_ID") 16 private Dept dept; 17 18 @OneToOne(cascade=CascadeType.ALL) 19 //@OneToOne 20 @JoinColumn(name="USER_ID") 21 private Userinfo userinfo; 22 23 @JsonBackReference 24 @ManyToMany(cascade= {CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH},fetch=FetchType.EAGER) 25 //@ManyToMany 26 @JoinTable(name="ROLE_USER_P",joinColumns= {@JoinColumn(name="USER_ID",referencedColumnName="USER_ID")}, 27 inverseJoinColumns= {@JoinColumn(name="ROLE_ID",referencedColumnName="ROLE_ID")}) 28 @OrderBy("ORDER_NO") 29 private Set<Role> roles= new HashSet<>(); //用戶對(duì)應(yīng)角色 30 31 @Column(name="USER_NAME") 32 private String userName; 33 34 @Column(name="PASSWORD") 35 private String password; 36 37 @Column(name="STATE") 38 private Integer state; 39 40 //getter和setter方法 41 } 42 43 @Entity 44 @Table(name="ROLE_P") 45 @DynamicInsert(true) 46 @DynamicUpdate(true) 47 public class Role extends BaseEntity { 48 @Id 49 @Column(name="ROLE_ID") 50 @GeneratedValue(generator="system-uuid") 51 @GenericGenerator(name="system-uuid",strategy="org.hibernate.id.UUIDGenerator") 52 private String id; //角色I(xiàn)D 53 54 @JsonBackReference 55 @ManyToMany(cascade= {CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH},fetch=FetchType.EAGER) 56 @JoinTable(name="ROLE_USER_P",joinColumns= {@JoinColumn(name="ROLE_ID",referencedColumnName="ROLE_ID")}, 57 inverseJoinColumns= {@JoinColumn(name="USER_ID",referencedColumnName="USER_ID")}) 58 private Set<User> users = new HashSet<>(0); //用戶對(duì)應(yīng)角色 59 60 @Column(name="NAME") 61 private String name; //角色名稱 62 63 @Column(name="REMARK") 64 private String remark; //備注 65 66 @Column(name="ORDER_NO") 67 private Integer orderNo; //排序號(hào) 68 69 //getter和setter方法 70 } View Code

?

  一個(gè)新的xml文件?beans-shiro.xml

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:jpa="http://www.springframework.org/schema/data/jpa"xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.8.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"><!-- 配置Spring整合shiro --><!-- 配置安全管理器 --><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><!-- 自定義realm域?qū)ο?--><property name="realm" ref="authRealm" /></bean><!-- 編寫realm類 --><bean id="authRealm" class="cn.ssm.trading.shiro.AuthRealm" /><!-- Spring框架整合Shiro框架 --><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><!-- 安全管理器 --><property name="securityManager" ref="securityManager" /><!-- 登陸頁面 --><property name="loginUrl" value="/login.jsp" /><!-- 認(rèn)證成功跳轉(zhuǎn)頁面 --><!-- <property name="successUrl" value="/index.jsp" /> --><!-- 無權(quán)限跳轉(zhuǎn)頁面 --><property name="unauthorizedUrl" value="/html/unauthorized.jsp" /><!-- 定義訪問規(guī)則 --><property name="filterChainDefinitions"><value><!-- anon:不用認(rèn)證, authc:需認(rèn)證 -->/login.jsp = anon/login* = anon/logout* = anon/css/** = anon/img/** = anon/js/** = anon/images/** = anon/js/** = anon/json/** = anon/make/** = anon/skin/** = anon/static/** = anon/resource/** = anon/html/** = authc/** = authc/*.* = authc</value></property></bean> </beans>

在spring配置文件中(配置了aop、事務(wù)管理、數(shù)據(jù)源的那個(gè)文件)加上:

? ? ? ?<!-- 導(dǎo)入shiro配置文件 -->  

  <import resource="classpath:beans-shiro.xml"/>

  <!-- 產(chǎn)生shiro核心控制器的方式,使用cglib生成代理 -->
  <aop:aspectj-autoproxy proxy-target-class="true" />

?

二、shiro過濾器 配置在web.xml中 放在springmvc分發(fā)器前

<!-- Shiro核心控制器,表示由spring管理生命周期 --><filter><filter-name>shiroFilter</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class><init-param><param-name>targetFilterLifecycle</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>shiroFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

?

三、開啟注解

在springmvc的配置文件中(配置了視圖解析器的那個(gè)文件)加入:

<!-- 保證實(shí)現(xiàn)了Shiro內(nèi)部lifecycle函數(shù)的bean執(zhí)行 --><bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /><!-- 生成代理,通過代理進(jìn)行控制 --><bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"><property name="proxyTargetClass" value="true" /></bean><!-- 安全管理器 --><bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"><property name="securityManager" ref="securityManager" /></bean><!-- 異常處理(無權(quán)限) --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><prop key="org.apache.shiro.authz.UnauthorizedException">/unauthorized.jsp</prop><prop key="org.apache.shiro.authz.UnauthenticatedException">redirect:/login.jsp</prop></props></property><property name="defaultErrorView" value="/error.jsp" /><property name="exceptionAttribute" value="ex" /></bean>

?

四、認(rèn)證 授權(quán)方法 編寫AuthRealm類(即'域'?)

1? public?class?AuthRealm?extends?AuthorizingRealm{
2
3 @Resource 4 UserService userService; 5 6 @Override 7 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) { 8 System.out.println("授權(quán)方法"); 9 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); 10 User user = (User) arg0.getPrimaryPrincipal();   //獲得當(dāng)前登陸的用戶 11 Set<Role> roles = user.getRoles();          //當(dāng)前用戶擁有的角色,根據(jù)自己的entity 12 //指示當(dāng)前用戶能訪問的資源 13 for(Role role : roles) { 14 info.addStringPermission(role.getName()); 15 } 16 return info; 17 } 18 19 @Override 20 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException { 21 System.out.println("認(rèn)證方法"); 22 UsernamePasswordToken token =(UsernamePasswordToken)arg0; 23 final String username = token.getUsername(); 24
       //fibd的查詢條件 25 Specification<User> spec = new Specification<User>() { 26 @Override 27 public Predicate toPredicate(Root<User> arg0, CriteriaQuery<?> arg1, CriteriaBuilder arg2) { 28 // TODO 自動(dòng)生成的方法存根 29 return arg2.equal(arg0.get("userName").as(String.class), username); 30 } 31 }; 32 List<User> userList = userService.find(spec);      //jpa,即在數(shù)據(jù)中找到滿足條件的用戶 33 if(userList!=null&&userList.size()>0) { 34 User user = userList.get(0); 35 //參數(shù)1:登陸的用戶,參數(shù)2:密碼,參數(shù)3:區(qū)分realm 36 return new SimpleAuthenticationInfo(user,user.getPassword(),getName()); 37 } 38 39 return null; 40 } 41 }

?

五、登陸認(rèn)證方法(在controller中)

1 @RequestMapping("/security/login.action") 2 public String login(String username,String password) { 9 Subject subject = SecurityUtils.getSubject(); 10 UsernamePasswordToken token = new UsernamePasswordToken(username,password);    //新建令牌 11 try { 12 subject.login(token);                                  //會(huì)去調(diào)用認(rèn)證方法16 return "redirect:/index.jsp"; 17 }catch(Exception e) {19 return "redirect:/login.jsp";                             //認(rèn)證失敗會(huì)拋出異常 20 } 21 }

?

六、授權(quán)

1、使用標(biāo)簽

  現(xiàn)在頁面中引入shiro標(biāo)簽 <%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%>

  例如:<shiro:hasPermission name='權(quán)限名'> 有該權(quán)限這里的內(nèi)容才會(huì)顯示 </shiro:hasPermission>

  其中name屬性:由于我們?cè)谏厦娴氖跈?quán)方法中加入當(dāng)前用戶所擁有的權(quán)限了 “info.addStringPermission(role.getName());”,所以此時(shí)會(huì)去判斷name所寫的權(quán)限名,當(dāng)前用戶是否擁有;

  更多標(biāo)簽請(qǐng)自行查閱文檔;

2、使用注解

在controller相應(yīng)的方法上加上

1 @RequestMapping("/list.action") 2 @RequiresPermissions("權(quán)限名") 3 public String list(Model model) { 4 .... 5 }

當(dāng)訪問該方法時(shí),會(huì)去判斷當(dāng)前用戶是否擁有該權(quán)限;

若無則拋出異常,會(huì)被上面spring-mvc配置文件中所寫的“異常處理”類攔截,然后轉(zhuǎn)向相應(yīng)頁面。

轉(zhuǎn)載于:https://www.cnblogs.com/Drajun/p/10325407.html

總結(jié)

以上是生活随笔為你收集整理的SSM中shiro的基本使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。