springboot+mybatis整合shiro——登录认证和权限控制
生活随笔
收集整理的這篇文章主要介紹了
springboot+mybatis整合shiro——登录认证和权限控制
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
- 引依賴
shiro-all包含shiro所有的包、shiro-core是核心包、shiro-web是與web整合、shiro-spring是與spring整合、shiro-ehcache是與EHCache整合、shiro-quartz是與任務(wù)調(diào)度quartz整合等等。
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.2.2</version> </dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.2.2</version> </dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-ehcache</artifactId><version>1.2.2</version> </dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.2.2</version> </dependency>- 數(shù)據(jù)庫
- Controller
- shiro配置
shiroConfiguration.java
@Configuration public class ShiroConfiguration {/*** ShiroFilterFactoryBean 處理攔截資源文件問題。* 注意:單獨(dú)一個(gè)ShiroFilterFactoryBean配置是或報(bào)錯(cuò)的,以為在* 初始化ShiroFilterFactoryBean的時(shí)候需要注入:SecurityManager** Filter Chain定義說明 1、一個(gè)URL可以配置多個(gè)Filter,使用逗號(hào)分隔 2、當(dāng)設(shè)置多個(gè)過濾器時(shí),全部驗(yàn)證通過,才視為通過* 3、部分過濾器可指定參數(shù),如perms,roles**/@Bean(name = "lifecycleBeanPostProcessor")public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {return new LifecycleBeanPostProcessor();}@Bean(name = "shiroRealm")@DependsOn("lifecycleBeanPostProcessor")public ShiroRealm shiroRealm() {ShiroRealm realm = new ShiroRealm();return realm;}@Bean(name = "ehCacheManager")@DependsOn("lifecycleBeanPostProcessor")public EhCacheManager ehCacheManager(){EhCacheManager ehCacheManager = new EhCacheManager();return ehCacheManager;}@Bean(name = "securityManager")public DefaultWebSecurityManager securityManager(){DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(shiroRealm());securityManager.setCacheManager(ehCacheManager());//用戶授權(quán)/認(rèn)證信息Cache, 采用EhCache 緩存return securityManager;}@Bean(name = "shiroFilter")public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager){ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager);System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");// 過濾鏈定義,從上向下順序執(zhí)行,一般將 /**放在最為下邊Map<String, String> filterChainDefinitionManager = new LinkedHashMap<String, String>();// 配置退出過濾器,其中的具體的退出代碼Shiro已經(jīng)替我們實(shí)現(xiàn)了filterChainDefinitionManager.put("/logout", "logout");// authc:所有url都必須認(rèn)證通過才可以訪問; anon:所有url都都可以匿名訪問filterChainDefinitionManager.put("/user/**", "authc,roles[user]");filterChainDefinitionManager.put("/admin/**", "authc,roles[admin]");filterChainDefinitionManager.put("/login", "anon");filterChainDefinitionManager.put("/index", "anon");filterChainDefinitionManager.put("/ajaxLogin", "anon");filterChainDefinitionManager.put("/statistic/**", "anon");filterChainDefinitionManager.put("/**", "authc,roles[user]");//其他資源全部攔截shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionManager);// 如果不設(shè)置默認(rèn)會(huì)自動(dòng)尋找Web工程根目錄下的"/login.jsp"頁面shiroFilterFactoryBean.setLoginUrl("/login");// 登錄成功后要跳轉(zhuǎn)的鏈接shiroFilterFactoryBean.setSuccessUrl("/success");// 未授權(quán)界面shiroFilterFactoryBean.setUnauthorizedUrl("/403");return shiroFilterFactoryBean;}@Bean@ConditionalOnMissingBeanpublic DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();daap.setProxyTargetClass(true);return daap;}@Beanpublic AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {AuthorizationAttributeSourceAdvisor aasa = new AuthorizationAttributeSourceAdvisor();aasa.setSecurityManager(securityManager);return aasa;}}shiroRealm.java
public class ShiroRealm extends AuthorizingRealm {private Logger logger = LoggerFactory.getLogger(ShiroRealm.class);//一般這里都寫的是servic,這里省略直接調(diào)用dao@Autowiredprivate UUserDao uUserDao;@Autowiredprivate URoleDao uRoleDao;@Autowiredprivate UPermissionDao uPermissionDao;/*** 登錄認(rèn)證* @param authenticationToken* @return* @throws AuthenticationException*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;logger.info("驗(yàn)證當(dāng)前Subject時(shí)獲取到token為:" + token.toString());//查出是否有此用戶String username = token.getUsername();UUser hasUser = uUserDao.selectAllByName(username);if (hasUser != null) {// 若存在,將此用戶存放到登錄認(rèn)證info中,無需自己做密碼對(duì)比,Shiro會(huì)為我們進(jìn)行密碼對(duì)比校驗(yàn)List<URole> rlist = uRoleDao.findRoleByUid(hasUser.getId());//獲取用戶角色List<UPermission> plist = uPermissionDao.findPermissionByUid(hasUser.getId());//獲取用戶權(quán)限List<String> roleStrlist=new ArrayList<String>();用戶的角色集合List<String> perminsStrlist=new ArrayList<String>();//用戶的權(quán)限集合for (URole role : rlist) {roleStrlist.add(role.getName());}for (UPermission uPermission : plist) {perminsStrlist.add(uPermission.getName());}hasUser.setRoleStrlist(roleStrlist);hasUser.setPerminsStrlist(perminsStrlist);// 若存在,將此用戶存放到登錄認(rèn)證info中,無需自己做密碼對(duì)比,Shiro會(huì)為我們進(jìn)行密碼對(duì)比校驗(yàn)return new SimpleAuthenticationInfo(hasUser, hasUser.getPswd(), getName());}return null;}/*** 權(quán)限認(rèn)證* @param principalCollection* @return*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {logger.info("##################執(zhí)行Shiro權(quán)限認(rèn)證##################");UUser user = (UUser) principalCollection.getPrimaryPrincipal();if (user != null) {//權(quán)限信息對(duì)象info,用來存放查出的用戶的所有的角色(role)及權(quán)限(permission)SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();//用戶的角色集合info.addRoles(user.getRoleStrlist());//用戶的權(quán)限集合info.addStringPermissions(user.getPerminsStrlist());return info;}// 返回null的話,就會(huì)導(dǎo)致任何用戶訪問被攔截的請(qǐng)求時(shí),都會(huì)自動(dòng)跳轉(zhuǎn)到unauthorizedUrl指定的地址return null;} }總結(jié)
以上是生活随笔為你收集整理的springboot+mybatis整合shiro——登录认证和权限控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hadoop大数据--深入讲解hdfs源
- 下一篇: Hadoop大数据--Mapreduce