snsapi login怎么申请获得loginURL

iframe包含的页面如何获取其所在页的父级页url地址
本回答由提问者推荐
var sogou_ad_id=731547;
var sogou_ad_height=160;
var sogou_ad_width=690;下次自动登录
现在的位置:
& 综合 & 正文
django中如何使用login_required来解决登陆的麻烦
在django中如果不使用login_required来解决判断用户是否登陆的话,就需要用
if request.user.is_authenticated(): ...else:...来判断 冗余代码非常大,下面介绍如何使用login_required,下面是转的。。
在django项目中,经常会看到下面这样的代码:
里面有一个@login_required标签。其作用就是告诉程序,使用这个方法是要求用户登录的。
1.如果用户还没有登录,默认会跳转到‘/accounts/login/’。这个值可以在settings文件中通过LOGIN_URL参数来设定。(后面还会自动加上你请求的url作为登录后跳转的地址,如: /accounts/login/?next=/polls/3/
登录完成之后,会去请求/poll/3)
2.如果用户登录了,那么该方法就可以正常执行
如果LOGIN_URL使用默认值,那么在urls.py中还需要进行如下设置:(加入下面这句)
(r'^accounts/login/$', 'django.contrib.auth.views.login'),
这样的话,如果未登录,程序会默认跳转到“templates\registration\login.html”这个模板。
如果想换个路径,那就再加个template_name参数,如下:
(r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html'}),
这样程序就会跳转到templates\myapp\login.html”
【上篇】【下篇】博客分类:
用过Spring Security的朋友应该比较熟悉对URL进行全局的权限控制,即访问URL时进行权限匹配;如果没有权限直接跳到相应的错误页面。Shiro也支持类似的机制,不过需要稍微改造下来满足实际需求。不过在Shiro中,更多的是通过AOP进行分散的权限控制,即方法级别的;而通过URL进行权限控制是一种集中的权限控制。本章将介绍如何在Shiro中完成动态URL权限控制。
本章代码基于《第十六章 综合实例》,请先了解相关数据模型及基本流程后再学习本章。
表及数据SQL
请运行shiro-example-chapter19/sql/ shiro-schema.sql 表结构
请运行shiro-example-chapter19/sql/ shiro-schema.sql 数据
具体请参考com.github.zhangkaitao.shiro.chapter19包下的实体。
public class UrlFilter implements Serializable {
private S //url名称/描述
private S //地址
private S //所需要的角色,可省略
private S //所需要的权限,可省略
表示拦截的URL和角色/权限之间的关系,多个角色/权限之间通过逗号分隔,此处还可以扩展其他的关系,另外可以加如available属性表示是否开启该拦截。
具体请参考com.github.zhangkaitao.shiro.chapter19.dao包下的DAO接口及实现。
具体请参考com.github.zhangkaitao.shiro.chapter19.service包下的Service接口及实现。
public interface UrlFilterService {
public UrlFilter createUrlFilter(UrlFilter urlFilter);
public UrlFilter updateUrlFilter(UrlFilter urlFilter);
public void deleteUrlFilter(Long urlFilterId);
public UrlFilter findOne(Long urlFilterId);
public List&UrlFilter& findAll();
基本的URL拦截的增删改查实现。
public class UrlFilterServiceImpl implements UrlFilterService {
@Autowired
private ShiroFilerChainManager shiroFilerChainM
public UrlFilter createUrlFilter(UrlFilter urlFilter) {
urlFilterDao.createUrlFilter(urlFilter);
initFilterChain();
return urlF
//其他方法请参考源码
@PostConstruct
public void initFilterChain() {
shiroFilerChainManager.initFilterChains(findAll());
UrlFilterServiceImpl在进行新增、修改、删除时会调用initFilterChain来重新初始化Shiro的URL拦截器链,即同步数据库中的URL拦截器定义到Shiro中。此处也要注意如果直接修改数据库是不会起作用的,因为只要调用这几个Service方法时才同步。另外当容器启动时会自动回调initFilterChain来完成容器启动后的URL拦截器的注册。
ShiroFilerChainManager
public class ShiroFilerChainManager {
@Autowired private DefaultFilterChainManager filterChainM
private Map&String, NamedFilterList& defaultFilterC
@PostConstruct
public void init() {
defaultFilterChains =
new HashMap&String, NamedFilterList&(filterChainManager.getFilterChains());
public void initFilterChains(List&UrlFilter& urlFilters) {
//1、首先删除以前老的filter chain并注册默认的
filterChainManager.getFilterChains().clear();
if(defaultFilterChains != null) {
filterChainManager.getFilterChains().putAll(defaultFilterChains);
//2、循环URL Filter 注册filter chain
for (UrlFilter urlFilter : urlFilters) {
String url = urlFilter.getUrl();
//注册roles filter
if (!StringUtils.isEmpty(urlFilter.getRoles())) {
filterChainManager.addToChain(url, "roles", urlFilter.getRoles());
//注册perms filter
if (!StringUtils.isEmpty(urlFilter.getPermissions())) {
filterChainManager.addToChain(url, "perms", urlFilter.getPermissions());
1、init:Spring容器启动时会调用init方法把在spring配置文件中配置的默认拦截器保存下来,之后会自动与数据库中的配置进行合并。
2、initFilterChains:UrlFilterServiceImpl会在Spring容器启动或进行增删改UrlFilter时进行注册URL拦截器到Shiro。
拦截器及拦截器链知识请参考《第八章 拦截器机制》,此处再介绍下Shiro拦截器的流程:
AbstractShiroFilter //如ShiroFilter/ SpringShiroFilter都继承该Filter
doFilter //Filter的doFilter
doFilterInternal //转调doFilterInternal
executeChain(request, response, chain) //执行拦截器链
FilterChain chain = getExecutionChain(request, response, origChain) //使用原始拦截器链获取新的拦截器链
chain.doFilter(request, response) //执行新组装的拦截器链
getExecutionChain(request, response, origChain) //获取拦截器链流程
FilterChainResolver resolver = getFilterChainResolver(); //获取相应的FilterChainResolver
FilterChain resolved = resolver.getChain(request, response, origChain); //通过FilterChainResolver根据当前请求解析到新的FilterChain拦截器链
默认情况下如使用ShiroFilterFactoryBean创建shiroFilter时,默认使用PathMatchingFilterChainResolver进行解析,而它默认是根据当前请求的URL获取相应的拦截器链,使用Ant模式进行URL匹配;默认使用DefaultFilterChainManager进行拦截器链的管理。
PathMatchingFilterChainResolver默认流程:
public FilterChain getChain(ServletRequest request, ServletResponse response, FilterChain originalChain) {
//1、首先获取拦截器链管理器
FilterChainManager filterChainManager = getFilterChainManager();
if (!filterChainManager.hasChains()) {
//2、接着获取当前请求的URL(不带上下文)
String requestURI = getPathWithinApplication(request);
//3、循环拦截器管理器中的拦截器定义(拦截器链的名字就是URL模式)
for (String pathPattern : filterChainManager.getChainNames()) {
//4、如当前URL匹配拦截器名字(URL模式)
if (pathMatches(pathPattern, requestURI)) {
//5、返回该URL模式定义的拦截器链
return filterChainManager.proxy(originalChain, pathPattern);
默认实现有点小问题:
如果多个拦截器链都匹配了当前请求URL,那么只返回第一个找到的拦截器链;后续我们可以修改此处的代码,将多个匹配的拦截器链合并返回。
DefaultFilterChainManager内部使用Map来管理URL模式-拦截器链的关系;也就是说相同的URL模式只能定义一个拦截器链,不能重复定义;而且如果多个拦截器链都匹配时是无序的(因为使用map.keySet()获取拦截器链的名字,即URL模式)。
FilterChainManager接口:
public interface FilterChainManager {
Map&String, Filter& getFilters(); //得到注册的拦截器
void addFilter(String name, Filter filter); //注册拦截器
void addFilter(String name, Filter filter, boolean init); //注册拦截器
void createChain(String chainName, String chainDefinition); //根据拦截器链定义创建拦截器链
void addToChain(String chainName, String filterName); //添加拦截器到指定的拦截器链
void addToChain(String chainName, String filterName, String chainSpecificFilterConfig) throws ConfigurationE //添加拦截器(带有配置的)到指定的拦截器链
NamedFilterList getChain(String chainName); //获取拦截器链
boolean hasChains(); //是否有拦截器链
Set&String& getChainNames(); //得到所有拦截器链的名字
FilterChain proxy(FilterChain original, String chainName); //使用指定的拦截器链代理原始拦截器链
此接口主要三个功能:注册拦截器,注册拦截器链,对原始拦截器链生成代理之后的拦截器链,比如
&bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"&
&property name="filters"&
&util:map&
&entry key="authc" value-ref="formAuthenticationFilter"/&
&entry key="sysUser" value-ref="sysUserFilter"/&
&/util:map&
&/property&
&property name="filterChainDefinitions"&
/login = authc
/logout = logout
/authenticated = authc
/** = user,sysUser
&/property&
filters属性定义了拦截器;filterChainDefinitions定义了拦截器链;如/**就是拦截器链的名字;而user,sysUser就是拦截器名字列表。
之前说过默认的PathMatchingFilterChainResolver和DefaultFilterChainManager不能满足我们的需求,我们稍微扩展了一下:
CustomPathMatchingFilterChainResolver
public class CustomPathMatchingFilterChainResolver
extends PathMatchingFilterChainResolver {
private CustomDefaultFilterChainManager customDefaultFilterChainM
public void setCustomDefaultFilterChainManager(
CustomDefaultFilterChainManager customDefaultFilterChainManager) {
this.customDefaultFilterChainManager = customDefaultFilterChainM
setFilterChainManager(customDefaultFilterChainManager);
public FilterChain getChain(ServletRequest request, ServletResponse response, FilterChain originalChain) {
FilterChainManager filterChainManager = getFilterChainManager();
if (!filterChainManager.hasChains()) {
String requestURI = getPathWithinApplication(request);
List&String& chainNames = new ArrayList&String&();
for (String pathPattern : filterChainManager.getChainNames()) {
if (pathMatches(pathPattern, requestURI)) {
chainNames.add(pathPattern);
if(chainNames.size() == 0) {
return customDefaultFilterChainManager.proxy(originalChain, chainNames);
和默认的PathMatchingFilterChainResolver区别是,此处得到所有匹配的拦截器链,然后通过调用CustomDefaultFilterChainManager.proxy(originalChain, chainNames)进行合并后代理。
CustomDefaultFilterChainManager
public class CustomDefaultFilterChainManager extends DefaultFilterChainManager {
private Map&String, String& filterChainDefinitionMap =
private String loginU
private String successU
private String unauthorizedU
public CustomDefaultFilterChainManager() {
setFilters(new LinkedHashMap&String, Filter&());
setFilterChains(new LinkedHashMap&String, NamedFilterList&());
addDefaultFilters(true);
public Map&String, String& getFilterChainDefinitionMap() {
return filterChainDefinitionM
public void setFilterChainDefinitionMap(Map&String, String& filterChainDefinitionMap) {
this.filterChainDefinitionMap = filterChainDefinitionM
public void setCustomFilters(Map&String, Filter& customFilters) {
for(Map.Entry&String, Filter& entry : customFilters.entrySet()) {
addFilter(entry.getKey(), entry.getValue(), false);
public void setDefaultFilterChainDefinitions(String definitions) {
Ini ini = new Ini();
ini.load(definitions);
Ini.Section section = ini.getSection(IniFilterChainResolverFactory.URLS);
if (CollectionUtils.isEmpty(section)) {
section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
setFilterChainDefinitionMap(section);
public String getLoginUrl() {
return loginU
public void setLoginUrl(String loginUrl) {
this.loginUrl = loginU
public String getSuccessUrl() {
return successU
public void setSuccessUrl(String successUrl) {
this.successUrl = successU
public String getUnauthorizedUrl() {
return unauthorizedU
public void setUnauthorizedUrl(String unauthorizedUrl) {
this.unauthorizedUrl = unauthorizedU
@PostConstruct
public void init() {
Map&String, Filter& filters = getFilters();
if (!CollectionUtils.isEmpty(filters)) {
for (Map.Entry&String, Filter& entry : filters.entrySet()) {
String name = entry.getKey();
Filter filter = entry.getValue();
applyGlobalPropertiesIfNecessary(filter);
if (filter instanceof Nameable) {
((Nameable) filter).setName(name);
addFilter(name, filter, false);
Map&String, String& chains = getFilterChainDefinitionMap();
if (!CollectionUtils.isEmpty(chains)) {
for (Map.Entry&String, String& entry : chains.entrySet()) {
String url = entry.getKey();
String chainDefinition = entry.getValue();
createChain(url, chainDefinition);
protected void initFilter(Filter filter) {
public FilterChain proxy(FilterChain original, List&String& chainNames) {
NamedFilterList configured = new SimpleNamedFilterList(chainNames.toString());
for(String chainName : chainNames) {
configured.addAll(getChain(chainName));
return configured.proxy(original);
private void applyGlobalPropertiesIfNecessary(Filter filter) {
applyLoginUrlIfNecessary(filter);
applySuccessUrlIfNecessary(filter);
applyUnauthorizedUrlIfNecessary(filter);
private void applyLoginUrlIfNecessary(Filter filter) {
//请参考源码
private void applySuccessUrlIfNecessary(Filter filter) {
//请参考源码
private void applyUnauthorizedUrlIfNecessary(Filter filter) {
//请参考源码
1、CustomDefaultFilterChainManager:调用其构造器时,会自动注册默认的拦截器;
2、loginUrl、successUrl、unauthorizedUrl:分别对应登录地址、登录成功后默认跳转地址、未授权跳转地址,用于给相应拦截器的;
3、filterChainDefinitionMap:用于存储如ShiroFilterFactoryBean在配置文件中配置的拦截器链定义,即可以认为是默认的静态拦截器链;会自动与数据库中加载的合并;
4、setDefaultFilterChainDefinitions:解析配置文件中传入的字符串拦截器链配置,解析为相应的拦截器链;
5、setCustomFilters:注册我们自定义的拦截器;如ShiroFilterFactoryBean的filters属性;
6、init:初始化方法,Spring容器启动时会调用,首先其会自动给相应的拦截器设置如loginUrl、successUrl、unauthorizedUrl;其次根据filterChainDefinitionMap构建默认的拦截器链;
7、initFilter:此处我们忽略实现initFilter,因为交给spring管理了,所以Filter的相关配置会在Spring配置中完成;
8、proxy:组合多个拦截器链为一个生成一个新的FilterChain代理。
Web层控制器
请参考com.github.zhangkaitao.shiro.chapter19.web.controller包,相对于第十六章添加了UrlFilterController用于UrlFilter的维护。另外,移除了控制器方法上的权限注解,而是使用动态URL拦截进行控制。
Spring配置——spring-config-shiro.xml
&bean id="filterChainManager"
class="com.github.zhangkaitao.shiro.spring.CustomDefaultFilterChainManager"&
&property name="loginUrl" value="/login"/&
&property name="successUrl" value="/"/&
&property name="unauthorizedUrl" value="/unauthorized.jsp"/&
&property name="customFilters"&
&util:map&
&entry key="authc" value-ref="formAuthenticationFilter"/&
&entry key="sysUser" value-ref="sysUserFilter"/&
&/util:map&
&/property&
&property name="defaultFilterChainDefinitions"&
/login = authc
/logout = logout
/unauthorized.jsp = authc
/** = user,sysUser
&/property&
filterChainManager是我们自定义的CustomDefaultFilterChainManager,注册相应的拦截器及默认的拦截器链。
&bean id="filterChainResolver"
class="com.github.zhangkaitao.shiro.spring.CustomPathMatchingFilterChainResolver"&
&property name="customDefaultFilterChainManager" ref="filterChainManager"/&
filterChainResolver是自定义的CustomPathMatchingFilterChainResolver,使用上边的filterChainManager进行拦截器链的管理。
&bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"&
&property name="securityManager" ref="securityManager"/&
shiroFilter不再定义filters及filterChainDefinitions,而是交给了filterChainManager进行完成。
&bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"&
&property name="targetObject" ref="shiroFilter"/&
&property name="targetMethod" value="setFilterChainResolver"/&
&property name="arguments" ref="filterChainResolver"/&
最后把filterChainResolver注册给shiroFilter,其使用它进行动态URL权限控制。
其他配置和第十六章一样,请参考第十六章。
1、首先执行shiro-data.sql初始化数据。
2、然后再URL管理中新增如下数据:
3、访问http://localhost:8080/chapter19/user时要求用户拥有aa角色,此时是没有的所以会跳转到未授权页面;
4、添加aa角色然后授权给用户,此时就有权限访问http://localhost:8080/chapter19/user。
实际项目可以在此基础上进行扩展。
示例源代码:;可加群
探讨Spring/Shiro技术。
浏览 131843
liyuejin 写道如果配置了 anon 的url,会有问题啊,会被后面的拦截到并且跳转到login, 有好的办法解决吗?好像顺序有问题,我跑起来的时候 需要把限制范围最大的放到最上面,需要改两个地方&&CustomPathMatchingFilterChainResolver
public FilterChain getChain(ServletRequest request, ServletResponse response, FilterChain originalChain) {
FilterChainManager filterChainManager = getFilterChainManager();
if (!filterChainManager.hasChains()) {
String requestURI = getPathWithinApplication(request);
//the 'chain names' in this implementation are actually path patterns defined by the user.
We just use them
//as the chain name for the FilterChainManager's requirements
for (String pathPattern : filterChainManager.getChainNames()) {
// If the path does match, then pass on to the subclass implementation for specific checks:
if (pathMatches(pathPattern, requestURI)) {
return customDefaultFilterChainManager.proxy(originalChain, pathPattern);
ShiroFilerChainManager &&
public void initFilterChains(List&UrlFilter& urlFilters) {
//1、首先删除以前老的filter chain并注册默认的
filterChainManager.getFilterChains().clear();
//2、循环URL Filter 注册filter chain
for (UrlFilter urlFilter : urlFilters) {
String url = urlFilter.getUrl();
//注册roles filter
if (!StringUtils.isEmpty(urlFilter.getRoles())) {
filterChainManager.addToChain(url, "roles", urlFilter.getRoles());
//注册perms filter
if (!StringUtils.isEmpty(urlFilter.getPermissions())) {
filterChainManager.addToChain(url, "perms", urlFilter.getPermissions());
if(defaultFilterChains != null) {
filterChainManager.getFilterChains().putAll(defaultFilterChains);
使用springBoot配置的时候,MethodInvokingFactoryBean配置了以后一直报循环引用的错误,这个在springBoot中如何配置?谢谢感谢@ousui 35楼回答,已解决& 定义ShiroFilterFactoryBean的时候set一下就OK了try { ((AbstractShiroFilter) factoryBean.getObject()).setFilterChainResolver(filterChainResolver());} catch (Exception e) { System.out.println("Register FilterChainResolver fail"); e.printStackTrace();}
shiro 1.2.4& 的 org.apache.shiro.spring.web.ShiroFilterFactoryBean 并没有& setFilterChainResolver 这个方法setFilterChainResolver 实际上调用的是 getObject().setFilterChainResolver()
shiro 1.2.4& 的 org.apache.shiro.spring.web.ShiroFilterFactoryBean 并没有& setFilterChainResolver 这个方法我也是被这卡住了。
如果配置了 anon 的url,会有问题啊,会被后面的拦截到并且跳转到login, 有好的办法解决吗?好像顺序有问题,我跑起来的时候 需要把限制范围最大的放到最上面,
CustomPathMatchingFilterChainResolver 里如果这么搞的话,如果配置了 anon 的url,会有问题啊,会被后面的拦截到并且跳转到login, 有好的办法解决吗?解决了没有?
自定义ShiroFilerChainManager中私有变量 defaultFilterChains必须为linkedHashMap,不然在XML中定义的拦截器就全部乱序了如果去实现?有例子不?
& 上一页 1
jinnianshilongnian
浏览量:1858409
浏览量:2348358
浏览量:4741494
浏览量:189233
浏览量:1348760
浏览量:198073
浏览量:4291946
浏览量:511459
浏览量:550468
这个尤其在springmvc+spring+hibernate ...
在网上看了一些服务降级的概念,感觉说的有两个方向:一个是针对提 ...
请问京东的自动降级标准是什么呢,除了依靠日志级别来判断,还有其 ...
&dependency&
&group ...
我想说的是 如果是用客户端进行加密算法 提交服务器如果这个客户 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'(飞翔的言)
(慕课分享)
(python编程)
(千夫影子)
第三方登录:}

我要回帖

更多关于 login怎么读 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信