79 lines
3.2 KiB
Plaintext
79 lines
3.2 KiB
Plaintext
<!---
|
||
Access check aka проверка доступа.
|
||
Если доступа нет, код, заключенный внутри тега, не выполняется, текст не выводится.
|
||
|
||
Два варианта использования.
|
||
1. При заданном значении действия проверяется наличие этого доступа к объекту, ответ да-нет
|
||
2. Проверяется уровень доступа к заданному объекту
|
||
|
||
Для пустого объекта
|
||
|
||
Если задать строковый атрибут output, в переменную с таким именем запишется
|
||
TRUE(доступ разрешен)/FALSE(доступ запрещен).
|
||
Тег обязательно должен быть закрыт.
|
||
---><cfsilent>
|
||
<!--- проверка на закрытость тега - без закрытия возможна неоднозначность со вложенными тегами --->
|
||
<cfif NOT thisTag.hasEndTag>
|
||
<cfthrow
|
||
type="custom" message="Unclosed AC.CFM tag found."
|
||
detail="AC.CFM tag must be closed. Self-closed tag is acceptable, e.g.: <cfmodule template=""mod/ac.cfm"" />.">
|
||
</cfif>
|
||
|
||
<cfif thisTag.ExecutionMode is 'start'>
|
||
|
||
<cfparam name="ATTRIBUTES.obj" type="string" default=""/><!---
|
||
объект, к которому проверяется доступ --->
|
||
<cfparam name="ATTRIBUTES.act" type="numeric" default="#request.PERMISSION_READ#"/><!---
|
||
действие, которое проверяется --->
|
||
<cfparam name="ATTRIBUTES.output" type="string" default=""/>
|
||
<cfparam name="ATTRIBUTES.permissionOut" type="string" default=""/>
|
||
|
||
|
||
|
||
<cfset permission=request.PERMISSION_NONE/>
|
||
|
||
<cfif ATTRIBUTES.obj EQ "">
|
||
<cfif #request.usrAuthenticated()#>
|
||
<cfset permission=request.PERMISSION_WRITE/>
|
||
<cfelse>
|
||
<cfset permission=request.PERMISSION_READ/>
|
||
</cfif>
|
||
|
||
<cfset permitted=(ATTRIBUTES.act EQ #request.PERMISSION_READ# OR #request.usrAuthenticated()#)/>
|
||
|
||
<cfelse>
|
||
|
||
<cftry>
|
||
<cfset permitted=(len(ATTRIBUTES.obj) GT 0)>
|
||
|
||
<!---*** Максимальный доступ для перечисленных объектов и ролей
|
||
Можно подумать о минимальном--->
|
||
<cfquery name="qACL" datasource="#request.DS#">
|
||
select coalesce(max(permission),0) as permission
|
||
from usr_role ur
|
||
join acl on acl.role_id=ur.role_id
|
||
where ur.usr_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#request.usr_id#">
|
||
and acl.obj in (<cfqueryparam cfsqltype="cf_sql_varchar" value="#ATTRIBUTES.obj#" list="true">)
|
||
</cfquery>
|
||
|
||
<cfset permitted=(qACL.permission GE ATTRIBUTES.act)>
|
||
<cfset permission=#qACL.permission#/>
|
||
|
||
<cfcatch type="database">
|
||
<cfset permitted="Yes"/><!---***--->
|
||
<cfrethrow/>
|
||
</cfcatch>
|
||
</cftry>
|
||
|
||
</cfif>
|
||
|
||
<cfif len(ATTRIBUTES.output)>
|
||
<cfset setVariable("CALLER.#ATTRIBUTES.output#", permitted)><!---boolean--->
|
||
</cfif>
|
||
<cfif len(ATTRIBUTES.permissionOut)>
|
||
<cfset setVariable("CALLER.#ATTRIBUTES.permissionOut#", permission)><!---integer 0 1 2--->
|
||
</cfif>
|
||
|
||
<cfif NOT permitted><cfexit method="EXITTAG"></cfif>
|
||
</cfif><!---thisTag.ExecutionMode is 'start'--->
|
||
</cfsilent> |