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> |